图解汉诺塔,用Python实现经典递归

感谢漂流的云图解汉诺塔问题(递归求解)
(1)先从最简单的模型开始,假如A柱有2个盘,我们的任务是把这两个盘按照规则(小叠在大上)移到C柱。操作步骤如下所示:
在这里插入图片描述
(2)现在把原始时A柱盘子数增加到100,那步骤不言而喻变得很复杂,但是我们可以通过一种方法把复杂的问题简单化:
在这里插入图片描述
可能此时你会觉得什么!怎么可以直接把这一大块就这样移过来!我们可以把那一大块红色再次看为2一大块,让2成为最大的蓝色3~100成为红色
在这里插入图片描述
(3)以此类推到最顶部的10099的移动,也就是我们一开始,拿到一个汉诺塔会去做的一件事:
在这里插入图片描述
在完成第一个回合,及99100成功脱离黑色块,也就是上图的最后一步,我们再次把99100合体为新的红色块,与新的蓝色块——98开始新一回合的移动。以此类推下去,就最终完成全部盘子从A柱到另外的柱子。
(4)我们再次回到第一次只有两个对象的那张图,不过这一次,我们假设在A柱上我们有n个盘子,这时候,还是的移动——1n-1
在这里插入图片描述
我们把移动步骤都列举下来:
n-1 from A --> B
1from A --> C
n-1 from B --> C
(5)最后,我们通过创建一个move( )函数,来实现这一功能:

def move(n, a, b, c):
    if n == 1:
        print(a, '-->', c)
    else:
        move(n-1, a, c, b)
        move(1, a, b, c)
        move(n-1, b, a, c)
a = input('请输入A柱盘子的个数:')
num = int(a)
print('把',num,'个盘子全部移到C柱子的顺序为:')
move(num, 'A', 'B', 'C')

所谓递归函数,就是一个函数在内部调用其自身本身的函数。以上的move( )函数就是一个很经典的递归函数,在循环语句的else部分,通过不断地调用自己,完成移动。move( )函数中,总共有4个参数:n, a, b, c。当n==1时,由第2位参数 --> 第4位参数。因此else部分的函数其实表达的是a --> b; a --> c; b --> c,及是(4)中模型的移动步骤。

猜你喜欢

转载自blog.csdn.net/weixin_42365252/article/details/83787897