汉诺塔问题:
相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如图1)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
————————————————
解题过程:
首先我们要知道,无论有多少个圆盘,最底下的圆盘 n 想要从起始柱移动到目标柱上,得先把除了 n 以外的圆盘移动到 移动到辅助柱上
也就是说,如果有 n 个圆盘,我们想把第 n 个移到 C 上,得先把上面的 n-1 个移动到 B 柱,然后才能把第 n 个圆盘移动到C上
那么问题又来了,想把 n 上面的 n-1 个圆盘移动到 B 上,我们又需要把第 n-1 个圆盘上面的 n-2 个圆盘先移到 C 上,才能把第 n-1 个移到 B 上
'''
不要总想着数学公式里面发现什么,跳出这个思维,问问自己这个函数干什么用的。前面教程中讲解,
告诉你函数是干什么的之后,就没有再深究函数里面的内容,而是按照函数的功能,自我调用。
汉诺塔函数的功能就是把所有(n个)盘子从a柱移c柱,在此之前需要先将最底层的一个盘子之外的所有盘子,
也就是n-1个盘子从a柱移到b柱,a柱最底下的那个盘子才能移c柱。现在,将n-1个盘子看成另一个所有盘子,
调用汉诺塔函数,将所有n-1个盘子从b柱移动到c柱,就完事了。
'''
def hanoi(n, a, b, c):
if n == 1:
print('第' + str(n) + '个圆盘从' + a + ', -->', c)
else:
hanoi(n - 1, a, c, b) # hanoi(2,'A','C','B')
print('第' + str(n) + '个圆盘从' + a + ', -->', c)
hanoi(n - 1, b, a, c)
# 调用
# hanoi(5, 'A', 'B', 'C')
'''
对函数执行过程进行说明讲解一下
当n=3时 函数执行过程
hanoi(n - 1, a, c, b) # hanoi(2,'A','C','B')
print('第' + str(n) + '个圆盘从' + a + ', -->', c) //当n=3时,打印A--->C
hanoi(n - 1, b, a, c) # hanoi(2,'B','A','C')
其中函数hanoi(2,'A','C','B') 递归调用自己函数 此时形参a='A' b='C' c='B'
hanoi(1, a, c, b) //打印A--->C
print('第' + str(n) + '个圆盘从' + a + ', -->', c) //打印A--->B
hanoi(1, b, a, c) //打印C--->B
其中函数hanoi(2,'B','A','C') 递归调用自己函数 此时形参a='B' b='A' c='C' 将B柱子上的2个圆盘借助辅助A柱子移动到C柱子
hanoi(1, a, c, b) //打印B--->A
print('第' + str(n) + '个圆盘从' + a + ', -->', c) //打印B--->C
hanoi(1, b, a, c) //打印A--->C
'''