你是否有跟我一样疑问,关于汉诺塔的代码,进来看看吧,共同学习
为了更好理解程序,我把代码改了一下,如下: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:} 不要去理解递归代码执行时的细节,人脑是无法处理这种复杂的执行顺序的。
至于第3个疑问,递归会在n=1时直接返回1,并不会有n=0,n=-1这些情况,因为在n=1时就已经终止。 递归这里用汉诺塔学习还是费脑子的,找个数学公式,比如用递归方式计算n的阶乘,或者银行n年的复利 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]