菜鸟学python(01)—— 汉诺塔递归 理解

来源:互联网 发布:苏氏钻头淘宝 编辑:程序博客网 时间:2024/05/27 14:12

最近刚开始在学Python语言,预备课就开始讲递归,感觉有点小蒙圈,上课老师的例子是——汉诺塔,下面介绍下我自己的理解。


上图为汉诺塔
游戏规则:1.游戏有三个立柱,在其中一根中有从上到下依次增大的N个空心圆盘
                  2.玩家需要将空心圆盘通过另两个柱子进行移动
                  3.每次只能移动一个,且保证任何情况下上面的柱子比下面的小
                  4.问,经过多少次,怎样的步骤,将排列整齐的圆盘全部移到另一个圆盘


送上代码:

def hano(n,A,B,C)    if n ==1:        print(A,C)    else:        hano(n-1,A,C,B)        hano(1,A,B,C)        hano(n-1,B,A,C)hano(3,'a','b','c')

'''
特别注意:1.每一次实参进入的顺序
                 2.实参对形参赋值是一一对应的
                 3.递归完成才能进入下一条
                 4. 以下代码,大写表示型参,小写表示实参

n=3 #顺序结构进入
    hano(3,A"a',B"b",C“c")   # 将A=a,B=b,C=c,一一对应进行赋值
        n=2
            hano(2,A"a",C"c",B"b")  #进入第一个递归 看清目前实参的顺序,上面已赋值,直接用

                n=1(1,A"a",C"c",B"b")
                    print(A,C)
                n=1(1,A"a",B"c",C"b")
                    print(A,C)
                n=1(1,B"a",A"c",C"b")
                    print(A,C)      #第一次递归结束
        n=1
            hano(1,A"a",B"b",C"c")
                print(A,C)          #递归以外的一次调用,A=a,B=b,C=c
        n=2
            hano(2,B"b",A"a",C"c")  #进入第二个递归 注意实参的顺序, 实参是本次递归的顺序
                n=1(1,A"b",C"a",B"c")
                    print(A,C)
                n=1(1,A"b",B"a",C"c")
                    print(A,C)
                n=1(1,B"b",A"a",C"c")
                    print(A,C)      #第二次递归完成
        


'''

以下是代码打印出来的结果:
a c
a b
c b
a c
b a
b c
a c