汉诺塔递归过程推导(详细+省流)
汉诺塔
本科就没看懂,总不能难我一辈子吧…
省流版
先简化问题,假设移动 n 个盘子到一根柱子上的过程为 f(n)
首先分析最简单的 f(1)
:
A --> C
再分析简单的 f(2)
:
A --> B
A --> C
B --> C
其中B --> C
就是 f(1)
的过程,只不过是把B换成了A
分析一下复杂的 f(3)
:
A --> C
A --> B
C --> B
发现上面是一个f(2)
过程(移动2个盘到B)
然后:
f(1): A --> C
此时A的最底下那块盘已移动完,不再考虑,剩下一个f(2)
过程
暂时不能往下分析了,因为我们发现已经不能简单的用f(n)
描述过程了,使用参数列表: F(n, *L)
表示:
重写上面的f(1)
过程:
F(1, A, C)
:
A --> C
重写上面的f(2)
过程:
F(2, A, B, C)
(通过B将2个盘从A移动到C):
F(1, A, B)
F(1, A, C)
F(1, B, C)
重写上面的f(3)
过程:
F(3, A, B, C)
:
F(2, A, C,B)
A盘剩一个:
F(1, A, C)
将B盘的2个放过去:
F(2, B, A, C)
暂时没发现明显规律, 接着推f(4)
过程:
F(4, A, B, C)
显然:
F(3, A, C, B)
此时A还剩最后一片:
F(1, A, C)
将B盘的3个放过去:
F(3, B, A, C)
这时, 我们发现规律: 将A的n-1个盘放到B, 再放最后一片到C, 接着把B当成A递归执行
总结成一般规律就是:
F(n, A, B, C):
F(n-1, A, C, B)
F(1, A, C)
F(n-1, B, A, C)
递归仍需要出口, 定义:
F(1, A, B, C)
F(1, A, C)
验证F(2, A, B, C)
过程:
F(2-1, A, C, B)
-
F(1, A, B)
F(1, A, C)
F(2-1, B, A, C)
-
F(1, B, C)
与上面的分析过程一致. 至此, 递归函数已经推导出来了