python递归汉诺塔详解_详解汉诺塔Python递归程序

学习递归时,很多小伙伴对汉诺塔的递归算法非常疑惑,不清楚那么复杂的移动过程,为何用四五行代码就给解决了。汉诺塔问题:有三根柱子A,B,C。A柱上有若干碟子,每次移动一块碟子,小的只能叠在大的上面,把所有碟子从A柱全部移到C柱上。

我从非常直观的角度,配合示意图来逐步分解,解释一下汉诺塔的python递归程序到底是怎

么运行的。

先说几个理解上的关键点【非常关键】:

(1)递归,说白了就是不考虑具体的实现细节,默认定义的函数可以实现想要的功能,然后

不断去调用这个函数,可以类比高中时的数学归纳法来理解,只不过归纳法是从小到大,而递

归是由大到小。

(2)对前n-1个圆盘进行操作时,最底下的第n个圆盘可以视作地面,因为第n个圆盘比前n-1

个圆盘都大。同理,要移动前n-2个圆盘时,那么第n-1,n个圆盘可以视作地面。

(3)对于函数move(n,A,B,C),里面的参数A,B,C是变量,它们的名称是什么不重要,

如下图所示,不变的是参数所对应的位置。

准确的说,move()函数的格式应该是:move(n,位置1,位置2,位置3)。

比如:move(n,A,B,C)表示把n个盘子从第一个位置参数所对应的柱子移动到第三个位置

参数所对应的柱子。同理,那么move(n,B,A,C)就表示n个圆盘从B柱移动到C柱。

下面我们来看python程序:

定义的函数为move(n,A,B,C),我们默认这个函数可以实现“把全部n个圆盘从A柱移动到C

柱”这一操作。然后由n逆推上一步(即如何把底部最大的盘子由A柱移动到C柱),注意这里

的上一步不是指具体的上一步,而是具有整体性的泛泛而谈的上一步。起始状态把前n-1个盘子从A柱移动到B柱上,对应函数move(n-1,A,C,B)把A柱最底层的第n个盘子移动到目标柱子:C柱把B柱上的前n-1个盘子移动到C柱,对应函数move(n-1,B,A,C)

这里肯定有人会疑惑,“把B柱上的前n-1个盘子整体移动到C柱”这个操作是如何做到的?

我们先回到定义的函数move(n,A,B,C),这个函数可以实现“把全部n个圆盘从A柱移动到C

柱”这一操作,我们先不管它具体是如何做到的,只是定义这个move()函数对应这个操

作,并假定这个操作一定可以实现。

那么上面的Step1“把前n-1个盘子从A柱移动到B柱上”,用函数来表示就是move(n-

1,A,C,B)。Step1完成后A柱第n个盘子上面就没有盘子了,这时Step2就可以把A柱底部的第n

个盘子(最大的盘子)移动到最终的目标柱C柱。

接下来Step3“把B柱上的前n-1个盘子移动到C柱”,用函数来表示就是move(n-1,B,A,C)。至此,从整体上来看,这个移动就完成了。

接下来具体解释一下这个递归程序到底是如何运行的:

n=1的情形很好理解,直接把这一个盘子从A柱移动到C柱就可以了。

n>1时,程序首先执行else里的第一个函数move(n-1,A,C,B)。①我们来看move(n-1,A,C,B)

是如何执行的呢:

再来回顾一下开头所提到的关键点:

即在一开始定义的move()函数框架下,当执行函数move(n-1,A,C,B)时,确实可以实现“把前n-1个盘子从A柱移动到B柱上”这一操作。

②对于函数move(n-1,A,C,B),假如n-1>1,依然要首先执行else分支里的第一个函数

move(n-2,A,B,C)。

......

③以此类推,直到到了n-k=1,即move函数中表示盘子数量的那个参数为1,这时程序开始执

行真正意义的第一步操作print(A,'--->',C),但要注意,这里的A和C只代表把move()函数

中第一个位置参数所对应的柱子上的盘子移动到第三个位置参数所对应的柱子上的盘子,假如

函数是move(1,B,A,C),那么则为print(B,'--->',C),假如函数是move(1,B,C,A),那么则为print(B,'--->',A)。

④move(1,位置1,位置2,位置3)的执行步骤已经知道了,那么move(2,位置1,位置

2,位置3)的执行步骤也就已知了,以move(2,A,B,C)举例[注:实际运行时move()函数

的位置1,2,3到底对应哪根柱子,程序会自己计算)],move(2,A,B,C)程序为:

到这里,move(2,位置1,位置2,位置3)的具体执行步骤已经知道了。

⑤同样的道理,move(3,位置1,位置2,位置3)乃至move(n-1,位置1,位置2,位置

3)的执行步骤就都是已知的了。这时我们来看最初的程序:

else分支下的move(n-1,A,C,B)和move(n-1,B,A,C)函数的具体执行步骤就都是已知的了。

至此,move (n,A,B,C)的整个执行步骤就很清晰了。

假如仍有疑惑,欢迎留言交流。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值