汉诺塔问题:
相传在古印度圣庙中,有一种被称为汉诺塔(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
        
'''

汉诺塔任务python 汉诺塔python原理_执行过程


汉诺塔任务python 汉诺塔python原理_递归调用_02