• python递归函数的执行过程


    举例:

    def nove(n,a,b,c):

      if n == 1:
        print(a,'------------>',c)
      else:
        nove(n-1,a,c,b)
        nove(1,a,b,c)
        nove(n-1,b,a,c)

    执行输出结果:

     nove(3, 'A', 'B', 'C')

    # A --> C
    # A --> B
    # C --> B
    # A --> C
    # B --> A
    # B --> C
    # A --> C

    执行过程详解:

    1 def nove(n, a='A', b='B', c='C'):

    2 if n == 1:

    3 return print(a, "->", c)

    4 else:

    5 nove((n-1), a, c, b)

    6 print(a, "->", c)

    7 nove((n-1), b, a, c)

    8

    9 nove(3)

    第6行print(a, "->", c)可以写做nove(1, a, b, c),个人感觉可以不用这么写,print(a, "->", c)这样可以让代码少跑两步。

    开始运行nove( 3 )

    nove 函数代入 ‘ 行9’ ( n = 3 )参数 (3, a='A', b='B', c='C')

    第一步 执行 ‘行2 - 3’ if n == 1:......

    n != 1 , ‘行2 - 3’越过

    第二步 执行 ‘行4’else:

    执行 ‘行5’, 第一次递归开始,((n-1), a, c, b)回到函数最初代入(3, a='A', b='B', c='C'),得出参数为(2, 'A', 'C', 'B'),【!注意: 此时‘行1 ’(3, a='A', b='B', c='C')在 ‘行5’ 递归回到函数最初运行后已改变为(2, a='A', b='C', c='B')

    执行 ‘行2 - 3’ ,n != 1 , ‘行2 - 3’ 越过

        • 执行else:
          • 执行 ‘行5’,将((n-1), a, c, b)代入(2, a='A', b='C', c='B'),得出参数为(1, 'A', 'B', 'C') ,继续执行 ‘行2 - 3’,n == 1 返回输出:(a, "->", c)代入(1, 'A', 'B', 'C'),即 A -> C
          • 回到 ’ 行5‘,继续执行 ‘行6’ ,将(a, "->", c)代入nove函数(2, a='A', b='C', c='B')并输出,即A -> B
          • 执行 ’行7‘,将( (n-1), b, a, c)代入(2, a='A', b='C', c='B')得出参数为(1, 'C', 'A', 'B'),继续执行 ‘行2 - 3’,n == 1 返回输出:(a, "->", c)代入(1, 'C', 'A', 'B'),即 C -> B
    • 第三步 执行 ‘行6’ print(a, "->", c)

    • (a, "->", c)代入nove函数(3, a='A', b='B', c='C')并输出,即A -> C
    • 第四步 执行 ’行7‘ nove((n-1), b, a, c)

    • 执行 ‘ 行7’ ,第二次递归开始,((n-1), b, a, c)代入(3, a='A', b='B', c='C')得出参数为(2, 'B', 'A', 'C')【!注意: 此时 ‘行1 ’ (3, a='A', b='B', c='C')在 ‘行7’ 递归回到函数最初运行后已改变为(2, a='B', b='A', c='C')
      • 执行 ‘行2 - 3’ ,n != 1 , ‘行2 - 3’ 越过
        • 执行else:
          • 执行 ‘行5’,将((n-1), a, c, b)代入(2, a='B', b='A', c='C')得出参数为(1, 'B', 'C', 'A'),继续执行‘行2 - 3’,n == 1 返回输出:(a, "->", c)代入(1, 'B', 'C', 'A') ,即 B -> A
          • 回到 ’ 行5‘,继续执行 ‘行6’ ,将(a, "->", c)代入nove函数(2, a='B', b='A', c='C')并输出,即B -> C
          • 执行 ’行7‘,将((n-1), b, a, c)代入(2, a='B', b='A', c='C')得出参数为(1, 'A', 'B', 'C'),继续执行 ‘行2 - 3’,n == 1 返回输出:(a, "->", c)代入(1, 'A', 'B', 'C') ,即 A -> C
          • 代码运行结束,输出结果为:

            A -> C
            A -> B
            C -> B
            A -> C
            B -> A
            B -> C
            A -> C
  • 相关阅读:
    常用颜色
    在VS2010中打开VS2012的项目
    vs2012 断点不能调试
    Setup Factory 打包.netframework 2.0
    Access 中数据库操作时提示from子句语法错误
    vs2012 .netFramwork2.0发布到xp
    c# access插入null值
    Visual Studio安装卸载模板
    Codeforces 455D
    ACdream 1157 (cdq分治)
  • 原文地址:https://www.cnblogs.com/bbox/p/10007944.html
Copyright © 2020-2023  润新知