|
楼主 |
发表于 2013-11-24 19:52
|
显示全部楼层
本帖最后由 香川群子 于 2013-11-24 20:12 编辑
下面我们回到汉诺塔问题:
但是,首先再次回顾一下阶乘的递归算法:
1. 参数 n
2. 递归过程计算规则:
f(k) =f(k-1)*n
3. 底部条件 n=1 时 s=1
于是就有:
Function f(n)
If n=1 Then
f=1
Else
f=f(n-1)*n
End If
End Function
……明白了吧。
那么,对于汉诺塔有:
1. 参数 n ,以及3根针的状态(源针A、过渡针B、目标针C)
2. 递归过程计算规则:
f(k) =f(k-1) [1~n-1金片作为整体全部: A→B,C过渡]+[n金片: A-C直接]+f(k-1)[1~n-1金片作为整体全部:B→C,A过渡]
3. 底部条件 n=1 时 f(1)=1[A-C直接]
因此有:
- Sub Hanoi()'汉诺塔解法过程
- Call dg_Hanoi2(5, "A", "C", "B") '以5阶塔为例计算,以"A"针起始,目标"C"针,以"B"针过渡
- End Sub
- Sub dg_Hanoi(n, a, c, b) '汉诺塔递归计算过程
- '参数为: n阶塔,以a针起始,目标c针,以b针过渡
- '需要注意的是:在递归过程中随着参数变化,
- '这时候的a针并非一定等于"A"针,同样b针/c针也并非一定是等于"B"针/"C"针
- If n = 1 Then
- Debug.Print "Move " & n & ": " & a & "→" & c
- '到n=1时为底部退出条件,并将第1个金片从a针移动到c针(不需要过渡)
- '需要注意的是:这时候的a针并非一定等于"A"针,同样c针也并非一定是等于"C"针
- Else
- Call dg_Hanoi(n - 1, a, b, c)
- '过程1: 模拟把全部n-1个金片,全部从a针移动到b针(c针过渡)
- '同样a针/b针/c针 并非一定是等于"A"针/"B"针/"C"针
- Debug.Print "Move " & n & ": " & a & "→" & c
- '过程2: 然后把第n个金片,直接从a针移动到目标c针(不需要过渡)
- '同样这里的a针/c针 并非一定是等于"A"针/"C"针
-
- Call dg_Hanoi(n - 1, b, c, a)
- '过程3: 然后模拟把全部n-1个金片,从过渡b针再移动到目标c针(以a针为过渡)
- '同样a针/b针/c针 并非一定是等于"A"针/"B"针/"C"针
- End If
- End Sub
复制代码 …………
需要注意的是:
a、b、c 3个针参数,并非固定的(如果固定就不需要把参数作为变量传递了)
而是根据目前的状态而确定哪个针是源针、哪个针是目标针,哪个针是过渡针。
这一点,可能是很多人无法直接理解的原因吧。
|
|