鱼C论坛

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

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

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

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

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

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

以3层为例,结果如下:
请输入汉诺塔的层数:3
1
2
1
3
2
1
2
1
3
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 | 显示全部楼层
def abc(n):
    if n == 1:
        print("1-->",n)
        #abc(n-1)
    else:
        print("2-->",n)
        abc(n-1)
        print("3-->",n)
        abc(n-1)


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

如果改结束条件改成n==-1,与1虽然差2,但结果如下,指数级增长一样,脑瓜真的转不过电脑:
2--> 2
2--> 1
2--> 0
1--> -1
3--> 0
1--> -1
3--> 1
2--> 0
1--> -1
3--> 0
1--> -1
3--> 2
2--> 1
2--> 0
1--> -1
3--> 0
1--> -1
3--> 1
2--> 0
1--> -1
3--> 0
1--> -1
最后谢谢各大佬的解答,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-25 01:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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