Python实现汉诺塔问题的递归算法

  汉诺塔(Tower of Hanoi)是一个经典的数学问题。它包含三个柱子(通常称为A(start)、B(auxiliary)和C(end)),以及一组从小到大排列的圆盘,开始时所有圆盘都放在A柱子上。目标是将所有圆盘从A柱子移动到C柱子上,期间可以借助B柱子作为辅助。其规则是:一次只能移动一个圆盘,并且大圆盘不能在小圆盘上面

Python实现汉诺塔问题的递归算法_第1张图片

以三个圆盘为例子,他的移动过程如下:

Python实现汉诺塔问题的递归算法_第2张图片

(图片来源:如何理解汉诺塔的递归? - 知乎 )

那么如何将n个圆盘移动到C列,其实这个过程我们可以看作三步:

1.把n-1个圆盘放到辅助列B

2.将A上剩余的一个圆盘放到C

3.将辅助列B上的n-1个圆盘拿到C

        想必看到这有人会问:万一n>2,不就不能同时移动n-1个圆盘了吗? 

        其实这就又变成了一道m层汉诺塔的问题(m=n-1),即如何将n-1个盘移动到辅助B列,只要先将n-2个移动到END列,再将此时最后一个盘移动到最终列B,最后将移至END列的n-2个盘移动到辅助B列

        只是此时以n-1个圆盘的视角来看,B列变成了我们的END最终列,C列也就变成了我们的auxiliary辅助列

我们来看代码:

def hanio(n, start, auxiliary,end):
    if n == 1:
        print("将圆盘从" + start + "移动到" + end)
    else:
        # 1. 将n -1个圆盘从A柱(start)经过C柱(end)移动到辅助柱B(auxiliary)
        hanio(n - 1, start, end,auxiliary)

        # 2. 将n个圆盘从A柱(start)移动到C柱(end)
        hanio(1, start, auxiliary, end)

        # 3. 将n-1个圆盘从辅助柱B(auxiliary)经过A柱(start)移动到C柱(end)
        hanio(n - 1, auxiliary, start, end)


hanio(3, "A", "B", "C")

以下是运行结果:

将圆盘从A移动到C
将圆盘从A移动到B
将圆盘从C移动到B
将圆盘从A移动到C
将圆盘从B移动到A
将圆盘从B移动到C
将圆盘从A移动到C

你可能感兴趣的:(python,前端,开发语言)