鱼C论坛

 找回密码
 立即注册
查看: 1395|回复: 13

请教~为什么这段代码停不下来?

[复制链接]
发表于 2023-12-18 01:01:47 | 显示全部楼层 |阅读模式

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

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

x
正在学习Python入门,请教一下:为什么执行这个递归的代码,会一直运行,停不下来~~按常理不应该是 “i” 的值为 0 的时候就停止了吗?

为什么会无限循环

为什么会无限循环

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-18 01:02:00 | 显示全部楼层
嗨!看到你的代码,问题出在 `i` 的值不会改变。递归函数中的 `i` 仅仅是参数传递而已,并不会因为递归调用而自动减小。所以你需要在每次递归调用时将 `i` 的值减小,这样才能让循环终止。

以下是一个修复的例子:
def countdown(i):    print(i)    if i <= 0:   # 如果 i 小于等于 0 则终止递归        return    else:        countdown(i-1)   # 递归调用并将 i 减小countdown(5)   # 调用递归函数
这样,当 `i` 的值逐渐减小,最终会达到 0,循环就停止了。希望能解决你的问题,如果还有其他疑问,请随时提问!

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

使用道具 举报

 楼主| 发表于 2023-12-18 01:10:41 | 显示全部楼层
FishC 发表于 2023-12-18 01:02
嗨!看到你的代码,问题出在 `i` 的值不会改变。递归函数中的 `i` 仅仅是参数传递而已,并不会因为递归调用 ...

“i”的值不会变,是指那个位置的“i”呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-18 01:10:58 | 显示全部楼层
黯然销魂辣 发表于 2023-12-18 01:10
“i”的值不会变,是指那个位置的“i”呢

抱歉,上一次回答中有误。我理解错了你的问题。

在你的代码中,没有明确指明递归函数的终止条件,因此它会无限地执行下去,直到达到Python的最大递归深度或者出现其他的错误。

要解决这个问题,你需要设定递归函数的终止条件。在你的例子中,当 `i` 的值为 0 时,递归应该停止。以下是一个修复的例子:
def countdown(i):    if i <= 0:        return    print(i)    countdown(i - 1)countdown(5)
在修复后的代码中,我们首先检查当前的 `i` 值是否小于等于 0,如果是的话,我们就返回函数并结束递归。否则,我们打印当前的 `i` 值,并且通过 `countdown(i - 1)` 调用函数本身,将 `i` 的值减小。这样递归将会继续执行,直到满足终止条件。

运行这段修复后的代码,你会看到从 5 倒数到 1 的输出结果。

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

使用道具 举报

 楼主| 发表于 2023-12-18 01:14:55 | 显示全部楼层
FishC 发表于 2023-12-18 01:10
抱歉,上一次回答中有误。我理解错了你的问题。

在你的代码中,没有明确指明递归函数的终止条件,因此它 ...

为什么 i 执行9次过后 ,i的值已经小于0了,仍然执行了while语句呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-18 01:15:13 | 显示全部楼层
黯然销魂辣 发表于 2023-12-18 01:14
为什么 i 执行9次过后 ,i的值已经小于0了,仍然执行 ...

抱歉,我之前的回答有误。你提到要解决递归函数的问题,但是在你的代码中并没有使用递归。这是因为你使用了 while 循环,而不是递归。

关于你提到的 while 循环执行9次后,`i` 的值已经小于0,但仍然继续执行 while 语句的问题。这是因为你在 while 循环内部没有对 `i` 的值进行减小操作,导致循环无法终止。你可以在每次循环结束后,将 `i` 的值减少1,如下所示:
i = 10while i >= 0:    print(i)    i -= 1
这样,每次循环都会将 `i` 的值减小,直到 `i` 的值小于0时,循环才会终止。这样你就可以得到输出从10到0的倒序数字。

希望这次能够解决你的问题!如果还有其他疑问,请随时提问。

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

使用道具 举报

 楼主| 发表于 2023-12-18 01:16:13 | 显示全部楼层
FishC 发表于 2023-12-18 01:15
抱歉,我之前的回答有误。你提到要解决递归函数的问题,但是在你的代码中并没有使用递归。这是因为你使用 ...

什么是递归
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-18 01:16:27 | 显示全部楼层

递归是指一个函数调用自己本身的过程。它是解决问题的一种常用方法,在编程中经常会遇到递归的应用场景。

递归函数通常包含两个部分:基本情况和递归情况。基本情况是指函数不再调用自身的情况,递归情况是指函数调用自身的情况。

当函数执行到基本情况时,递归终止,返回结果或者执行其他操作。当函数执行到递归情况时,函数会调用自身,并且传入不同的参数,以便解决更小规模的子问题。

递归在解决某些问题上非常高效简洁,比如数学中的阶乘、斐波那契数列等。但是需要注意的是,递归函数如果没有正确的终止条件或递归过深,可能导致栈溢出或者运行时间过长。

对于递归的理解,可以类比盗梦空间电影中的"梦中梦"的结构。每进入一层梦境,都是一个相同的结构,只是规模更小,直到达到最底层,然后再逐层返回。

希望这个解释能够帮助你理解递归的概念。如果有任何问题,请随时提问。

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

使用道具 举报

 楼主| 发表于 2023-12-18 01:17:46 | 显示全部楼层
FishC 发表于 2023-12-18 01:16
递归是指一个函数调用自己本身的过程。它是解决问题的一种常用方法,在编程中经常会遇到递归的应用场景。 ...

while 语句不能称为递归吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-18 01:17:58 | 显示全部楼层
黯然销魂辣 发表于 2023-12-18 01:17
while 语句不能称为递归吗

你说得对,我之前给出的解释并没有涉及到`while`循环。实际上,递归和循环是两种不同的编程概念。

递归是一种函数自身调用自身的方式,通过不断地将问题划分为更小的子问题来解决整个问题。递归的终止条件保证了递归函数最终会停止调用自身。

而循环是一种重复执行某个代码块的结构,根据给定的条件判断是否继续循环。循环通常使用`for`循环或`while`循环来实现。

虽然递归和循环都可以用来迭代地解决问题,但它们的实现方式和思维方式是不同的。递归更加适合解决问题具有重复性质的情况,而循环则更加适合处理迭代次数已知或固定的情况。

所以,`while`循环不能被称为递归,因为它并没有涉及函数自身的调用。在循环中,代码块会反复执行,直到给定条件不满足为止。

希望这次解释能够更清楚地回答你的问题!如果还有其他疑问,请随时提问。

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

使用道具 举报

 楼主| 发表于 2023-12-18 01:21:46 | 显示全部楼层
如果执行一下代码,并赋值 i = 10,会出现那种结果呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-18 01:21:58 | 显示全部楼层
黯然销魂辣 发表于 2023-12-18 01:21
如果执行一下代码,并赋值 i = 10,会出现那种结果呢

如果执行以下代码,并设置 `i = 10`:
i = 10while i >= 0:    print(i)    i -= 1
那么输出将会是从10到0的倒序数字,每个数字占一行,如下所示:
109876543210
逐渐递减的数字是通过循环中的 `i -= 1` 语句实现的。每次循环,`i` 的值减少1,直到 `i` 的值小于0,由于终止条件 `i >= 0` 不再满足,循环结束。

希望这个例子能够帮助你理解具体的执行结果!如果还有其他问题,请随时提问。

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

使用道具 举报

 楼主| 发表于 2023-12-18 01:22:19 | 显示全部楼层
def funC(i):
    i -= 1
    while i > 0:
        print("我被调用了~")        
        print(f"此时i的值是{i}")
        funC(i)
   
如果执行这段代码,并赋值 i = 10,会出现怎样的结果呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-18 01:22:36 | 显示全部楼层
黯然销魂辣 发表于 2023-12-18 01:22
def funC(i):
    i -= 1
    while i > 0:
       ...

如果执行这段代码,并赋值 `i = 10`,会出现以下的结果:

我被调用了~
此时i的值是9
我被调用了~
此时i的值是8
我被调用了~
此时i的值是7
我被调用了~
此时i的值是6
我被调用了~
此时i的值是5
我被调用了~
此时i的值是4
我被调用了~
此时i的值是3
我被调用了~
此时i的值是2
我被调用了~
此时i的值是1

解释一下上述代码的执行过程:

1. 初始时,`i` 的值为 10,所以进入循环。
2. 打印 "我被调用了~" 和当前 `i` 的值(初始值为 9)。
3. 然后调用 `funC(i)`,这将导致函数再次执行,但是参数 `i` 的值减少了 1。
4. 在递归的内部,重复步骤 2 和步骤 3,直到 `i` 的值小于等于 0,才会退出递归。
5. 递归的过程中,每次 `i` 的值都不同,因此每次的输出也会有变化。

总结起来,这段代码会打印出一系列的 "我被调用了~" 和对应的 `i` 值。在每次递归调用时,`i` 的值都会减少1,直到最终递归终止。希望这样的解释能够帮助你理解代码的执行结果!如有其他问题,请随时提问。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 22:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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