汉诺塔
汉诺塔问题是指有三根柱子, 称为ABC, 开始时A柱上有若干圆盘, 从下往上由大到小排列. 每根柱子像栈一样, 只能从顶端存取. 现在希望将这些圆盘移动到C柱, 移动过程中需要保证较大的圆盘一定在小圆盘下方.
由于最大的圆盘始终在最下面, 所以只能先将剩余圆盘移动到辅助柱B, 将大圆盘移动到C, 再将剩余圆盘移动到C. 于是问题变成如何将除最大圆盘外的塔移动到B, 可以递归解决.
func hanoi(n int, src, aid, dst byte) int {
if n <= 0 {
return 0
}
step := 1
step += hanoi(n - 1, src, dst, aid)
fmt.Printf("将 圆盘%d 从 %c柱 移动到 %c柱\n", n, src, dst)
step += hanoi(n - 1, aid, src, dst)
return step
}
反复调用不难发现, 移动步数为 \(2^n - 1\) 步.

浙公网安备 33010602011771号