鱼C论坛

 找回密码
 立即注册
查看: 2663|回复: 3

[已解决]你是否有跟我一样疑问,关于汉诺塔的代码,进来看看吧,共同学习

[复制链接]
发表于 2023-1-8 11:12:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
为了更好理解程序,我把代码改了一下,如下:
  1. def hanoi(n, x, y, z):
  2.     if n == 1:
  3.         print("1")  # 如果只有 1 层,直接将金片从 x 移动到 z
  4.     else:
  5.         hanoi(n-1, x, z, y) # 将 x 上的 n-1 个金片移动到 y
  6.         print("2")  # 将最底下的金片从 x 移动到 z
  7.         hanoi(n-1, y, x, z) # 将 y 上的 n-1 个金片移动到 z
  8.         print("3")
  9. n = int(input('请输入汉诺塔的层数:'))
  10. hanoi(n, 'A', 'B', 'C')
复制代码


以3层为例,结果如下:
  1. 请输入汉诺塔的层数:3
  2. 1
  3. 2
  4. 1
  5. 3
  6. 2
  7. 1
  8. 2
  9. 1
  10. 3
  11. 3
复制代码


看到这里,我实在搞不懂代码顺序是怎么跑的
抛开汉诺塔的逻辑,只看代码
疑问1:开始时 N=3,代码不是应该先跑到else,但实际的是先打印1,再打印2,即先跑了if ,然后又跑了ELSE(细看结果)
疑问2:结果为1-->2,1-->3,,即print("1")到print("2"),再次运行时print("1")就直接到print("3")了,为什么会跳过print("2")这些我也是搞不懂。
疑问3:递归以什么为准才算结束的,因为没看到明显的结束跳出条件,为什么不会一直N=0,N=-1,N=-2,这样一直运行下去?

希望有大佬 帮我释疑,不然我不知道如何学下去了。
最佳答案
2023-1-8 11:21:04
不要去理解递归代码执行时的细节,人脑是无法处理这种复杂的执行顺序的。
至于第3个疑问,递归会在n=1时直接返回1,并不会有n=0,n=-1这些情况,因为在n=1时就已经终止。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-8 11:21:04 | 显示全部楼层    本楼为最佳答案   
不要去理解递归代码执行时的细节,人脑是无法处理这种复杂的执行顺序的。
至于第3个疑问,递归会在n=1时直接返回1,并不会有n=0,n=-1这些情况,因为在n=1时就已经终止。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-8 11:40:30 | 显示全部楼层
递归这里用汉诺塔学习还是费脑子的,找个数学公式,比如用递归方式计算n的阶乘,或者银行n年的复利
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-9 10:08:12 | 显示全部楼层
  1. def abc(n):
  2.     if n == 1:
  3.         print("1-->",n)
  4.         #abc(n-1)
  5.     else:
  6.         print("2-->",n)
  7.         abc(n-1)
  8.         print("3-->",n)
  9.         abc(n-1)


  10. abc(2)
复制代码

结果如下:
  1. 2--> 2
  2. 1--> 1
  3. 3--> 2
  4. 1--> 1
复制代码

一步步跟下去,总算明白了,IF n == 1其实相当于就是结束条件,
12行第一次调用函数,实参是2,然后代入7行自调用,等满足IF条件==1时,结束第一次自身调用。
然后再把实参2代入9行的自调用,等满足IF条件==1时,执行完IF内的语句后就算真正的结束。

如果改结束条件改成n==-1,与1虽然差2,但结果如下,指数级增长一样,脑瓜真的转不过电脑:
  1. 2--> 2
  2. 2--> 1
  3. 2--> 0
  4. 1--> -1
  5. 3--> 0
  6. 1--> -1
  7. 3--> 1
  8. 2--> 0
  9. 1--> -1
  10. 3--> 0
  11. 1--> -1
  12. 3--> 2
  13. 2--> 1
  14. 2--> 0
  15. 1--> -1
  16. 3--> 0
  17. 1--> -1
  18. 3--> 1
  19. 2--> 0
  20. 1--> -1
  21. 3--> 0
  22. 1--> -1
复制代码

最后谢谢各大佬的解答,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-22 02:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表