汉诺塔

汉诺塔问题是指有三根柱子, 称为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\) 步.

posted @ 2025-03-07 00:29  aparaburu  阅读(76)  评论(0)    收藏  举报