试着通过汉诺塔(Hanoi塔)理解递归算法-Python

前言:以前一直没能理解这个问题,今天突然豁然开朗,就想明白了,所以做个记录。

如果有理解错的地方,欢迎评论区指正。

问题描述

有三根相邻的柱子,标号为A,B,C, A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,请问应该怎么移动?
在这里插入图片描述

代码:

def Move(n,start,middle,target):
    if n==1:
        print(start,'->',target)
        return 
    Move(n-1,start,target,middle)
    print(start,'->',target)
    Move(n-1,middle,start,target)
Move(3,A,B,C)

思路

这道题目的思路就是递归算法,
递归的核心在于递归的一种思路,不要总是试图钻到递归里面去思考一层一层是怎么递归改变变量的,你的小脑袋瓜没有那么那么大的栈区!!!

1.首先给几个定义:
我们定义目前需要转移的圆盘数量为——n
我们目前阶段所有的圆盘都放在一个柱子上,我们叫这个柱子为——start,所以起始时刻A=start
我们目的是要将些它们都转移到另一个柱子上,我们叫这个柱子为——target,所以起始时刻C=target
同时,还剩下那一个没有被定义的柱子,我们不妨叫它——middle,所以起始时刻B=middle

2.我们想将n个圆盘从start=A移动到它的target=C,首先应该将n-1个圆盘从start=A移动到middle=B,这时对于n-1个圆盘而言,它们的target=B;
在这里插入图片描述

那我们怎么样才可以把n-1个圆盘从都移动到B呢,就是先将n-2个圆盘从start=A移动到target=C。
依次类推,直到n=1了,这个时候直接将这一个圆盘从它的start移动到target。
简而言之,
移动n个圆盘的时候,它有start,middle,target;
这时需要先移动n-1个圆盘,它的start还是start,它的target就是上一次的middle了。
在代码里也就是对应:

def Move(n,start,middle,target):
    if n==1:
        print(start,'->',target)
        return 
    Move(n-1,start,target,middle) 

现在我们将n-1个圆盘从都移动到B了,也就是说所有的递归都结束了,我们又回到了当前层,还记得当前层吗?当前层start=A,target=C。我们接下来要做的就是将1个圆盘从A移动到C就可以。
在这里插入图片描述

对应代码就是多了一行:

def Move(n,start,middle,target):
    if n==1:
        print(start,'->',target)
        return 
    Move(n-1,start,target,middle)
    print(start,'->',target)

这个时候还没有结束,在n=n这层,我们n-1个圆盘都在middle=B上了,我们应该将它们从middle=B移动到target=C上了,怎么移动?借助A呗,换句话说,对于n=n-1这层,现在start就是n=n层中middle, middle就是n=n层中的start,target就是n=n层中target。
用代码而言:

def Move(n,start,middle,target):
    if n==1:
        print(start,'->',target)
        return 
    Move(n-1,start,target,middle)
    print(start,'->',target)
    Move(n-1,middle,start,target)

最后再做个小总结,简而言之就是每层递归都要将上一层递归时的middle作为此层的target,
然后递归结束回到本层的时候,再移动start到target。
移动结束之后因为n-1个圆盘被放在了middle上,所以这时要以middle为起点,将这些圆盘移动到target。

猜你喜欢

转载自blog.csdn.net/qq_49030008/article/details/124898077
今日推荐