Discuss / Python / 卡在这里整整一天,总结了一下送给后边学习的朋友作参考,希望可以为你节省些时间,有像我一样非要弄清楚代码具体运行步骤的可以看一看

卡在这里整整一天,总结了一下送给后边学习的朋友作参考,希望可以为你节省些时间,有像我一样非要弄清楚代码具体运行步骤的可以看一看

Topic source

宋忠义_

#1 Created at ... [Delete] [Delete and Lock User]
1 def move(n, a='A', b='B', c='C'):
2    if n == 1:
3        return print(a, "->", c)
4    else:
5    move((n-1), a, c, b)
6    print(a, "->", c)
7    move((n-1), b, a, c)
8
9 move(3)
  • 第6行print(a, "->", c)可以写做move(1, a, b, c),但是个人觉得分十分没有必要,既然都是一样的效用还是让代码少跑两步的好。
  • 百度出来的博客大多知其然不知其所以然,看了也白看纯粹他妈的浪费时间。
  • 为了让和我一样同为新手的朋友可以看懂,所以写的略啰嗦了一些,头大的朋友可以放弃,今天发现几位老程序员也不明白这个代码的具体运行步骤,所以这个不懂好像也无所谓......

开始运行move( 3 )

  • move 函数代入 ‘ 行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)代入move函数(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)代入move函数(3, a='A', b='B', c='C')并输出,即*A -> C

第四步 执行 ’行7‘ move((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)代入move函数(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

讲得很详细,谢谢老哥

vae76058

#3 Created at ... [Delete] [Delete and Lock User]

哈喽,灰常感谢大神的总结,但是第二步和第三步中有一些地方的即后面没有东西了,所以可以麻烦上传下图片吗?蟹蟹٩('ω')و

感谢。就是还没弄清楚

bobi2333

#5 Created at ... [Delete] [Delete and Lock User]

谢谢指导,很有收获。 不过好像第六行应该缩进的。

平凡神王

#6 Created at ... [Delete] [Delete and Lock User]

请教一个问题:【!注意: 此时‘行1 ’(3, a='A', b='B', c='C')在 ‘行5’ 递归回到函数最初运行后已改变为(2, a='A', b='C', c='B')】 这个部分的值为什么存的是n=2的情况,在初次打印后的值不是变成(1,A,B,C)了吗?

感谢!原来递归是这样的执行顺序,只是不明白如何思考得出a,b,c排列顺序的答案?

第六行不用缩进

asade69552

#9 Created at ... [Delete] [Delete and Lock User]

为什么第5.6.7行缩进后的结果跟删掉else后不缩进返回的结果都是对的?虽然我觉得应该是不缩进

AppleK

#10 Created at ... [Delete] [Delete and Lock User]

看到那么多分析,脑袋都要爆炸了


  • 1
  • 2

Reply