鱼C论坛

 找回密码
 立即注册
查看: 548|回复: 6

[已解决]菜鸟小白学python的疑问

[复制链接]
发表于 2024-1-11 21:31:45 | 显示全部楼层 |阅读模式

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

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

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

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 ?

想了一下午想不通,请不吝指教
最佳答案
2024-1-11 21:57:27
  1. hanoi(3)
  2.     hanno(2)          # 递归调用 hanno(2)
  3.         hanno(1)      # 递归调用 hanno(1)
  4.             print(0)  # 在 hanno(1) 中,n = 1,打印出 数字 0,递归到达终点,开始逐级返回
  5.         print(2)      # 返回到 hanno(2) 中,n = 2,打印出 2
  6.     print(3)          # 返回到 hanno(3) 中,n = 3,打印出 3
复制代码


    所以,执行 hanno(3) 会依序打印数字 0 , 2 , 3
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-11 21:43:57 | 显示全部楼层
FishC 发表于 2024-1-11 21:31
不要着急,我来帮你解答这个问题。

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

这真的是AI吗?还能识别我的具体问题来进行分析,惊呆了。。。好像稍微有那么一点明白,似懂非懂的感觉,还需要多思考一下。谢谢啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-11 21:44:05 | 显示全部楼层
a36804070 发表于 2024-01-11 21:43
这真的是AI吗?还能识别我的具体问题来进行分析,惊呆 ...


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-11 21:57:27 | 显示全部楼层    本楼为最佳答案   
  1. hanoi(3)
  2.     hanno(2)          # 递归调用 hanno(2)
  3.         hanno(1)      # 递归调用 hanno(1)
  4.             print(0)  # 在 hanno(1) 中,n = 1,打印出 数字 0,递归到达终点,开始逐级返回
  5.         print(2)      # 返回到 hanno(2) 中,n = 2,打印出 2
  6.     print(3)          # 返回到 hanno(3) 中,n = 3,打印出 3
复制代码


    所以,执行 hanno(3) 会依序打印数字 0 , 2 , 3
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

当你调用 han ...

大佬,修改后的程序和原本的一样吧,还是感谢你的耐心解答,我明白了。谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 17:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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