廖雪峰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 语句执行完毕,递归结束


    原文作者: 汉诺塔问题
    原文地址: https://blog.csdn.net/qazwsxza/article/details/80427663
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞