­

[Python]递归函数-理解汉诺塔

  • 2020 年 3 月 10 日
  • 筆記
原创文章

原文链接:https://blog.csdn.net/humanking7/article/details/90697845


文章目录
  • @[toc]

  • 1. 代码及结果
    • 1.1. Python文件代码
    • 1.2. 显示结果
  • 2.理解
  • 3. 新加代码

Python的递归函数-理解汉诺塔

1. 代码及结果

1.1. Python文件代码

# 利用递归函数移动汉诺塔:  def move(n, a, b, c):      if n == 1:          print('move', a, '-->', c)      else:          move(n-1, a, c, b)  # 先把A号桩当做起点桩,B号桩当做终点桩,C号桩当做中间桩,移动A号桩上面n-1个盘子到B号桩          move(1, a, b, c)  # 然后把A号桩剩下的最后一个盘子移动到C号桩          move(n-1, b, a, c)  # 最后把B号桩当做起点桩,A号桩当做中间桩,把n-1个盘子移动到C号桩(终点桩)    if __name__ == "__main__":      move(3, 'A', 'B', 'C')

1.2. 显示结果

move A --> C  move A --> B  move C --> B  move A --> C  move B --> A  move B --> C  move A --> C

2.理解

其实不要想那么复杂,按照“块”的思想,先把上面(n-1)块盘子当做一个盘子,然后再来思考,我用下面的一幅图来告诉大家,其实真的不要想太多。

3. 新加代码

加上一行代码估计会更加好理解代码的流程。

# 利用递归函数移动汉诺塔:  def move(n, a, b, c):      global g_n      if n == 1:          g_n = g_n + 1          print(g_n, ' move', a, '-->', c)      else:          move(n-1, a, c, b)  # 先把A号桩当做起点桩,B号桩当做终点桩,C号桩当做中间桩,移动A号桩上面n-1个盘子到B号桩          move(1, a, b, c)  # 然后把A号桩剩下的最后一个盘子移动到C号桩          move(n-1, b, a, c)  # 最后把B号桩当做起点桩,A号桩当做中间桩,把n-1个盘子移动到C号桩(终点桩)    if __name__ == "__main__":      g_n = 0      move(5, 'A', 'B', 'C')
1  move A --> C  2  move A --> B  3  move C --> B  4  move A --> C  5  move B --> A  6  move B --> C  7  move A --> C  8  move A --> B  9  move C --> B  10  move C --> A  11  move B --> A  12  move C --> B  13  move A --> C  14  move A --> B  15  move C --> B  16  move A --> C  17  move B --> A  18  move B --> C  19  move A --> C  20  move B --> A  21  move C --> B  22  move C --> A  23  move B --> A  24  move B --> C  25  move A --> C  26  move A --> B  27  move C --> B  28  move A --> C  29  move B --> A  30  move B --> C  31  move A --> C