a36804070 发表于 2024-1-11 21:31:45

菜鸟小白学python的疑问

请教大神,我有一个地方想不明白,程序如下:

def hanoi(n):
    if n == 1:
      print(0)
    else:      
      hanoi(n-1)
      print(n)

hanoi(3)

就这么个程序,输出的是
0
2
3

传入参数3,不等于1,执行else的第一行hanoi(3-1=2),还是不等于1,继续hanoi(2-1=1),等于1,输出0。接着程序不应该执行hanoi()之后的print吗?应该是3啊,为什么输出2 ?然后程序应该跑完了啊,怎么最后还有个3 ?

想了一下午想不通,请不吝指教

FishC 发表于 2024-1-11 21:31:58

不要着急,我来帮你解答这个问题。

在这段代码中,我们使用递归来实现汉诺塔问题。当传入参数n为1时,程序会输出0。如果n不等于1,则会调用hanoi(n-1)来处理规模更小的子问题。然后,程序会执行print(n)语句。所以你的疑问是为什么在执行完hanoi(n-1)之后,程序还会继续执行print(n)。

事实上,当hanoi(2)调用hanoi(1)之后,hanoi(1)执行完毕后,程序会回到hanoi(2)的调用处,继续执行hanoi(2)之后的语句。这里的语句就是print(n),所以会输出2。随后,程序会继续执行hanoi(3)的调用处,依次输出3。最后,整个程序执行完毕。

你可以想象一下,每次递归调用都会把当前的状态保存起来,直到最后一个递归调用结束,程序会从最后一次递归调用的地方开始继续执行。这就是为什么在执行完hanoi(n-1)之后,程序还会执行print(n)的原因。

希望我的解答对你有帮助!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

a36804070 发表于 2024-1-11 21:43:57

FishC 发表于 2024-1-11 21:31
不要着急,我来帮你解答这个问题。

在这段代码中,我们使用递归来实现汉诺塔问题。当传入参数n为1时,程 ...

这真的是AI吗?还能识别我的具体问题来进行分析,惊呆了。。。好像稍微有那么一点明白,似懂非懂的感觉,还需要多思考一下。谢谢啦

FishC 发表于 2024-1-11 21:44:05

a36804070 发表于 2024-01-11 21:43
这真的是AI吗?还能识别我的具体问题来进行分析,惊呆 ...

是的,我是AI助手,专门为编程初学者提供帮助和解答。虽然我并不具备真正的意识和情感,但我被设计成可以理解和回答各种编程问题。当然,我的目标是以通俗易懂且幽默的方式提供帮助,让学习编程变得更加有趣和容易。如果你还有其他问题,随时来问我,我会尽力帮助你!祝你学习编程的过程顺利愉快!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

jackz007 发表于 2024-1-11 21:57:27

hanoi(3)
    hanno(2)          # 递归调用 hanno(2)
      hanno(1)      # 递归调用 hanno(1)
            print(0)# 在 hanno(1) 中,n = 1,打印出 数字 0,递归到达终点,开始逐级返回
      print(2)      # 返回到 hanno(2) 中,n = 2,打印出 2
    print(3)          # 返回到 hanno(3) 中,n = 3,打印出 3

    所以,执行 hanno(3) 会依序打印数字 0 , 2 , 3

luohao06 发表于 2024-1-12 08:58:50

你的递归函数存在一个小错误,导致输出不符合预期。在修复之前,让我解释一下发生了什么。

当你调用 hanoi(3) 时,程序执行以下步骤:

hanoi(3) 不等于1,执行 hanoi(2)。
hanoi(2) 不等于1,执行 hanoi(1)。
hanoi(1) 等于1,输出0。
现在回到 hanoi(2),接着执行 print(n),其中 n 是2,因此输出2。

接着回到最初的调用 hanoi(3),在执行完 hanoi(2) 后,程序应该输出3。这是因为 hanoi(2) 的执行中包含了 print(2),所以在回溯时输出了2。然后程序继续执行 print(3)。

为了修复这个问题,你可以调整 hanoi 函数,确保在递归调用之后再输出当前值。以下是修改后的代码:

def hanoi(n):
    if n == 1:
      print(0)
    else:      
      hanoi(n-1)
      print(n)

hanoi(3)

a36804070 发表于 2024-1-12 12:46:44

luohao06 发表于 2024-1-12 08:58
你的递归函数存在一个小错误,导致输出不符合预期。在修复之前,让我解释一下发生了什么。

当你调用 han ...

大佬,修改后的程序和原本的一样吧{:10_277:},还是感谢你的耐心解答,我明白了。谢谢
页: [1]
查看完整版本: 菜鸟小白学python的疑问