正经标题:汉诺塔问题解析与递归函数
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
在python里可以用递归函数优雅的解决汉若塔问题
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
代码:
>>>def move(n,a,b,c):
... if n==1:
... print(a,'-->',c)
... else:
... move(n-1,a,c,b) #将前n-1个盘子从a移动到b上
... move(1,a,b,c) #将最底下的最后一个盘子从a移动到c上
... move(n-1,b,a,c) #将b上的n-1个盘子移动到c上
>>> move(3,'A','B','C')
A --> C
A --> B
C --> B
A --> C
B --> A
B --> C
A --> C
分析一下应该是这样:
懂的玩这个的人知道规律是,柱子分为起始柱子,跳板柱子,目标柱子
“宏观”看,目标是借助跳板柱子,把起始柱子n个圈弄到目标柱子:用move(n,a,b,c) 代表这个大步骤,a是起始,中间参数b是跳板,c是目标。总之假设move(n,a,b,c) 就是代表能办成这事的标准。
具体如何办到?
- 大了看分三步:
第一步是把n-1个a借助c弄到b,所以递归同理第一步就是 move(n-1,a,c,b)
第二步是把最底下这个a弄到c,move(1,a,b,c)
第三步将b上的n-1个盘子移动到c上,move(n-1,b,a,c)
打开冰箱,放进大象,关掉冰箱,搞定!
这里的abc应解读为起始柱子,跳板柱子,目标柱子。 - 小了看都是这三步:
比如第一步怎么能把n-1个a弄到b,第一(1)步就是,把n-2个a弄到c:move(n-2,a,b,c);第一(2)步是把最后一个a弄到b:....底下就知道怎么回事了。 - 关键输出步骤是n=1的时候,也就是 起始柱子-->目标柱子 在标准move(n,a,b,c) 里,就是print(a,'-->',c) ,注意不是('A''-->''C')。
拆分过程看看:
感觉递归函数很好用,像是把一头大象在宏观上分解成合乎共同逻辑的关键几大块。先切出大块,再递归循环下去,按照切大块的方法把每一个大块切成小块,都切到n=1的时候,就能把大象吃了。