(Python)廖雪峰老师网站上面的汉诺塔问题分析

汉诺塔问题就是有三个柱子,A柱子上面有三个圆盘,圆盘按由小到大的顺序,从上而下的排列。现在要把所有圆盘从A移动到C,要求每次移动圆盘,小圆盘都在大圆盘的上面。

来看代码
def move(n, a, b, c):
if n == 1:
print(‘move’, a, ‘–>’, c)
else:
move(n-1, a, c, b)
move(1, a, b, c)
move(n-1, b, a, c)

move(3, ‘A’, ‘B’, ‘C’)

为了移动n个圆盘,先把n-1个圆盘移动到B,然后把最底下的大圆盘移动到C,之后再把n-1个圆盘移动到C。
也就是说,为了解决n个圆盘,所以先解决上面的n-1个圆盘,因为n=1时是直接移动到柱子c上的(这么想,假如只有一个圆盘,那么就是直接a到c)。现在为了简化为一个圆盘,先把上面的n-1个圆盘给移走。而为了移走上面的n-1个圆盘,就要解决n-2个圆盘。就是在不断的递归调用。

具体过程如下:
先讲清楚一点,小写的a,b,c指的是变量,而不是实体柱子
大写的A,B,C说的才是柱子。变量a和c可以根据情况指向不同的柱子。

当运行move(3, ‘A’, ‘B’, ‘C’)时,不满足n=1,所以开始运行else里面的三个语句,这三个语句,第一个语句的作用是把n-1个圆盘移动到b。

为了方便理解,这里不看三个圆盘,假如只有两个圆盘,如何把两个圆盘从A移动到C。语句经过了n-1变成了move(2, ‘A’, ‘B’, ‘C’),这个语句的 n 也不等于1,所以它也要单独的经历else里面的三个语句。因为此时n为2,所以再减一,就变成了move(1, ‘A’, ‘B’, ‘C’)满足了n=1的条件,然后看a与c的位置,此时分别对应的是“A”与“B”,所以第一步是把第一个圆盘从A移动到B,接着else的第二条语句是把第二个圆盘由A移动到C,然后第三条语句,发现a对应的是“B”,c对应的是“C”,所以是把圆盘都移动到了c。到这里运行的都是 move(2, a, b, c)这个函数。
在这里插入图片描述
这里完成了两个圆盘由A到C的过程

现在回到三个圆盘上面来,上面有说过,else里第一个句子是为了把n-1个圆盘移到b,那么只需要对move(2, a, b, c)稍作修改,变成move(2, a, c, b)即可,也就是最开始代码里面,else下面的第一条语句。
在移走后,来到else的第二句话,柱子A只剩下最大的那个圆盘,满足n=1,直接移动到C
然后借助else第三句话,把之前移走的n-1个圆盘移动到C
至此就完成了三个圆盘的全部移动过程
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一纸春秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值