概述:
据说古代有一个梵塔,塔内有三个底座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上。
有一个和尚想把这64个盘子从A座移到C座,但每次只能允许移动一个盘子,在移动盘子的过程中可以利用B座,但任何时刻3个座上的盘子都必须始终保持大盘在下、小盘在上的顺序。如果只有一个盘子,则不需要利用B座,直接将盘子从A移动到C即可。和尚想知道这项任务的详细移动步骤和顺序。
这实际上是一个非常巨大的工程,是一个不可能完成的任务。
根据数学知识我们可以知道,移动n个盘子需要(2^n-1)步,64个盘子需要18446744073709551615步。如果每步需要一秒钟的话,那么就需要584942417355.072年。
def hannuo(num, src, dst, temp=None): #声明用来记录移动次数的变量为全局变量 global times #确认参数类型和范围(可不写) #---------------------------------------------------------------- assert type(num) == int, 'num must be integer' assert num > 0, 'num must > 0' #---------------------------------------------------------------- #只剩最后或只有一个盘子需要移动,这也是函数递归调用的结束条件 if num == 1: print('The {0} Times move:{1}==>{2}'.format(times, src, dst)) times += 1 else: #递归调用函数自身, #先把除最后一个盘子之外的所有盘子移动到临时柱子上 hannuo(num-1, src, temp, dst) #把最后一个盘子直接移动到目标柱子上 hannuo(1, src, dst) #把除最后一个盘子之外的其他盘子从临时柱子上移动到目标柱子上 hannuo(num-1, temp, dst, src) #用来记录移动次数的变量 times = 1 #A表示最初放置盘子的柱子src,C是目标柱子dst,B是临时柱子temp
n = int(input()) hannuo(n, 'A', 'C', 'B')
n = 3时,效果如图
【扩展实例】
汉诺塔实践
描述
请补充编程模板中代码,完成如下功能:
有三个圆柱A、B、C,初始时A上有N个圆盘,N由用户输入给出,最终移动到圆柱C上。
每次移动步骤的表达方式示例如下:[STEP 10] A->C。其中,STEP是步骤序号,宽度为4个字符,右对齐。
请编写代码,获得输入N后,输出汉诺塔移动的步骤。
输入格式
一个整数
输出格式
每个步骤一行,每行参考格式如下:[STEP 10] A->C
输入输出示例
输入 | 输出 | |
示例 1 | |
|
steps = 0 def hanoi(src, des, mid, n): global steps if n == 1: steps += 1 print("[STEP{:>4}] {}->{}".format(steps, src, des)) else: hanoi(src, mid, des, n-1) steps += 1 print("[STEP{:>4}] {}->{}".format(steps, src, des)) hanoi(mid, des, src, n-1) N = eval(input()) hanoi("A", "C", "B", N)