同舟 发表于 2023-1-8 11:12:55

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

为了更好理解程序,我把代码改了一下,如下:
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,这样一直运行下去?

希望有大佬 帮我释疑,不然我不知道如何学下去了。{:5_94:} {:5_94:} {:5_94:}

tommyyu 发表于 2023-1-8 11:21:04

不要去理解递归代码执行时的细节,人脑是无法处理这种复杂的执行顺序的。
至于第3个疑问,递归会在n=1时直接返回1,并不会有n=0,n=-1这些情况,因为在n=1时就已经终止。

lassiter 发表于 2023-1-8 11:40:30

递归这里用汉诺塔学习还是费脑子的,找个数学公式,比如用递归方式计算n的阶乘,或者银行n年的复利

同舟 发表于 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
最后谢谢各大佬的解答,谢谢!
页: [1]
查看完整版本: 你是否有跟我一样疑问,关于汉诺塔的代码,进来看看吧,共同学习