汉诺塔
三柱以上一般解,“Frame-Stewart Algorithm” 证明在四柱情况下最优,往上未证,当下来说应该没有更优解了。
Java/Python 代码传送门
三柱经典解
三步递归
- 移动 N-1 个碟子 起始柱–>缓冲柱
- 移动 1 个碟子 起始柱–>目标柱
- 移动 N-1 个碟子 缓冲柱–>目标柱
在这三步里,起始柱,缓冲柱,和目标柱是相互转换的关系。
"""
@param N 需要移动的碟子数量
@param src 起始柱
@param buff 缓冲柱
@param dst 目标柱
"""
def Hanoi(N, src, buff, dst):
# 只有一个碟子的情况下,可以直接移动该碟子至目标处。
if N==1:
# 这里 碟子使用 array(java 对应 stack)存储, 可以用来展示每次移动后的情况
dst.push(src.pop())
# 否则,三步递归
else:
# 第一步,移动 N-1 个碟子 从目标到缓冲柱,这个过程中,当前的缓冲柱与目标柱在下层互换身份。
Hanoi(N-1, src, dst, buff)
# 第二步,移动剩下的1个碟子 从 起始柱到目标柱,这里缓冲柱应当包含所有的 N-1 个碟子。
Hanoi(1, src, buff, dst)
# 第三步, 移动 N-1 个碟子 从缓冲柱到目标柱,这里 缓冲柱与起始柱 在下层互换身份。
Hanoi(N-1, buff, src, dst)
不难看出,这个算法移动 N 个碟子所需的步骤为: