廖雪峰python递归汉诺塔作业参数详解

不懂实现原理的自行百度或参考递归经典案例汉诺塔 python实现

此文章只给菜鸟解释参数变化

def move(n, a, b, c):  
    if(n == 1):  
        print(a,"->",c)  
    move(n-1, a, c, b)  
    move(1, a, b, c)  
    move(n-1, b, a, c)  
move(3, 'A', 'B', 'C')

开始,注意关键字

“传值”是按位置传下去,顺序可能会变,只有调用主函数时才会传值

             a='A' c='C' b='B'

                ↓        ↓        ↓

move(n   ,a,       b,       c) 

              a='A' b='C' c='B' 

“用值”是在本层中用到a,b,c这三个值的具体值不变,同层值不变

当n=3

move(n-1,a,c,b)

进入第一层循环时

a='A',b='C',c='B' 

则三次调用主函数

a,b,c数值分别相同

move(n-1,a,c,b) a='A',c='B',b='C'
move(1,a,b,c) a='A',b='C',c='B' 
move(n-1,b,a,c) b='C',a='A',c='B'
move(3,'A','B','C')  
move(n,a,b,c) #第一次调用 传值'A','B','C' 此时n=3,a='A',b='B',c='C'这几个值在本次调用中都不变
    #if(n == 1) n=3不走
    move(n-1,a,c,b)  #调用主函数,传值n=2,a='A',c='C',b='B',将值传入,注意传入的是值,将2,'A','C','B'按位置传下去,也就是move(2,'A','C','B') 
        move(n,a,b,c) #此处进入第一层循环 用值a='A',b='C',c='B' 此时n=2,a='A',b='C',c='B'循环 这几个值在本层调用中都不变
            #if(n == 1) n=2不走
            move(n-1,a,c,b) #传值n=1,a='A',c='B',b='C' 调用主函数,将值传入
                move(n,a,b,c)  #进入第二层循环 用值'A','B','C'此时n=1,a='A',b='B',c='C'
                    if(n == 1):#执行
                        print(a,"->",c)#a='A',c='C'输出A->C return 第二层循环完了,执行第一层循环没有执行完的语句move(1, a, b, c)
            move(1,a,b,c)#调用主函数move(n,a,b,c) 传的值是第一层的值 传值a='A',b='C',c='B'
                move(n,a,b,c)#用值a='A',b='C',c='B'
                    if(n == 1):#执行
                        print(a,"->",c)#a='A',c='B'输出A->B 执行下一条语句
            move(n-1,b,a,c) #调用主函数move(n,a,b,c) 传的值是第一层的值 传值b='C',a='A',c='B'
                move(n,a,b,c)#用值a='C',b='A',c='B'
                    if(n == 1):#执行
                        print(a,"->",c)#a='C',c='B'输出C->B return 第一层循环完了,执行第一次调用未执行的move(1, a, b, c)
    move(1,a,b,c)#调用主函数move(n,a,b,c) 传的值是第一次调用的值 传值a='A',b='B',c='C'
        if(n == 1):#执行
            print(a,"->",c)#a='A',c='C'输出A->C 执行第一次调用的下一条语句move(n-1,b,a,c)
    move(n-1,b,a,c)#调用主函数move(n,a,b,c) 传的值是第一次调用的值 传值n=3,b='B',a='A',c='C'
        move(n,a,b,c) #此处进入第一层循环 用值a='B',b='A',c='C' 此时n=2,a='B',b='A',c='C'循环 这几个值在本次调用中都不变
            #if(n == 1) n=2不走
            move(n-1,a,c,b) #传值n=1,a='B',c='C',b='A' 调用主函数,将值传入
                move(n,a,b,c) #进入第二层循环 用值'B','C','A'此时n=1,a='B',b='C',c='A'
                    if(n == 1):#执行
                        print(a,"->",c)#a='B',c='A'输出B->A return 第二层循环完了,执行第一层循环没有执行完的语句move(1, a, b, c)
            move(1,a,b,c)#调用主函数move(n,a,b,c) 传的值是第一层的值 传值a='B',b='A',c='C'
                move(n,a,b,c)#用值a='B',b='A',c='C'
                    if(n == 1):#执行
                        print(a,"->"c)#a='B',c='C'输出B->C 执行下一条语句
            move(n-1,b,a,c) #调用主函数move(n,a,b,c) 传的值是第一层的值 传值b='A',a='B',c='C'
                move(n,a,b,c)#用值a='A',b='B',c='C'
                    if(n == 1):#执行
                        print(a,"->",c)#a='A',c='C'输出A->C return 语句执行完毕,递归结束




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值