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