鱼C论坛

 找回密码
 立即注册
查看: 78|回复: 4

[已解决]分支语句课后练习的困惑

[复制链接]
发表于 2024-12-5 23:27:41 | 显示全部楼层 |阅读模式

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

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

x
讲解分支语句的课后练习题如下:
验证角谷猜想
角谷猜想的内容是:任意给定一个正整数,若它为偶数则除以 2,若它为奇数则乘以 3 再加 1,得到一个新的自然数,按照这样的方法计算下去,最终的结果必将是:
比如给定的自然数是 5,则 5 * 3 + 1 = 16 -> 16 / 2 = 8 -> 8 / 2 = 4 -> 4 / 2 = 2 -> 2 / 2 = 1。
现在要求大家编写一个验证角谷猜想的程序。

该题的答案如下:
n = int(input("请输入一个自然数:"))
   
while n > 0:
    if n % 2 == 0:
        print(n, "/2 = ", n // 2, sep='')
        n = n // 2
    else:
        print(n, "*3+1 = ", n * 3 + 1, sep='')
        n = n * 3 + 1
    if n == 1:
        break

运行结果如下:
请输入一个自然数: 5
5*3+1 = 16
16/2 = 8
8/2 = 4
4/2 = 2
2/2 = 1

我的困惑是:
1)为何在if和else的分支里的语句块最后不需要加上continue语句,好让判断完的语句返回到while循环语句进行第二轮判断.
2)我如果在if和else的语句块最后都加上continue语句的话,程序运行起来就会进入到死循环(请见截图),这是为什么?烦请大神指点,谢谢!

最佳答案
2024-12-6 11:31:47
本帖最后由 jackz007 于 2024-12-6 17:03 编辑
n = int(input("请输入一个自然数:"))
while n > 0:
    if n % 2 == 0:                                # 无条件执行【1.1】
        print(n, "/2 = ", n // 2, sep='')
        n = n // 2
    else:                                         # 无条件执行【1.2】
        print(n, "*3+1 = ", n * 3 + 1, sep='')
        n = n * 3 + 1
    if n == 1:                                    # 无条件执行【2】
        break

      在这个 while 循环中,无条件执行的是两个 if 语句,其他语句都是从属。【1.1】、【1.2】属于同一个 if ... else 结构,本身互斥,不需要 continue ,【2】位于循环末尾,没有任何需要略过的语句,所以,也不需要 continue 。
      我们知道,continue 会略过循环中剩余的语句直接返回,如果在【1.1】、【1.2】中使用 continue,则 【2】会被无条件略过,而【2】是循环的唯一出口,这样做会废弃循环出口,这就是死循环的根本原因。
分支截图.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-12-5 23:28:35 | 显示全部楼层
你的困惑主要集中在 `continue` 语句的使用上。我们来逐一解答:

1. **为何不需要加 `continue` 语句:**

   在 Python 中,`continue` 语句的作用是跳过当前循环的剩余部分,直接进入下一次循环的判断。在你的程序中,`if` 和 `else` 分支的最后一行已经更新了 `n` 的值,并且没有其他语句需要跳过,所以不需要 `continue`。程序会自然地回到 `while` 循环的条件判断部分。

2. **加上 `continue` 后进入死循环的原因:**

   如果在 `if` 和 `else` 分支的最后都加上 `continue`,程序会在更新 `n` 的值后立即跳过剩余的代码,直接回到 `while` 循环的条件判断部分。由于 `while` 循环的条件是 `n > 0`,而 `n` 在循环中不断被更新,最终会变成 1。此时,`n` 不会再被更新为 0 或更小的值,导致程序一直在 `n = 1` 的情况下循环,形成死循环。

   解决方法是:在 `n == 1` 时,使用 `break` 语句跳出循环,这样就不会进入死循环。

希望这些解释能帮助你理解程序的运行逻辑!


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

使用道具 举报

发表于 2024-12-6 00:41:23 | 显示全部楼层
问题 1:为何在 if 和 else 分支里不需要加 continue?

在 Python 的 while 循环中,程序会按照流程依次执行代码。当执行到 if 或 else 分支中的代码时,如果没有特别的指令(比如 break 或 continue),程序会自然地执行完当前分支代码后,继续从循环顶部开始下一轮迭代。

在你的代码中,每次经过 if 或 else 的分支后,n 的值都会被更新(即 n = n // 2 或 n = n * 3 + 1),然后程序会自动返回到 while n > 0: 进行下一轮判断,不需要额外的 continue 指令。

简而言之:

continue 的作用是强制跳过循环中剩余的代码,直接进入下一轮循环。而你的代码在 if 和 else 中已经完成了所有需要执行的语句,接着会自然返回到循环顶部,根本不需要用 continue。

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

使用道具 举报

发表于 2024-12-6 00:42:18 | 显示全部楼层
问题 2:如果加了 continue,为何会进入死循环?

为了理解这个问题,先来看 continue 的作用:

continue 会立即结束当前循环的剩余部分,并直接跳到循环的下一轮迭代。

结合你的代码:
n = int(input("请输入一个自然数:"))

while n > 0:
    if n % 2 == 0:
        print(n, "/2 = ", n // 2, sep='')
        n = n // 2
        continue  # 强制跳到 while 顶部
    else:
        print(n, "*3+1 = ", n * 3 + 1, sep='')
        n = n * 3 + 1
        continue  # 强制跳到 while 顶部
    if n == 1:  # 这一段永远不会被执行到
        break
出现死循环的原因:

  • 当添加了 continue 后,程序在执行完 if 或 else 分支中的代码后,会直接跳到 while 的顶部,跳过循环体中剩余的代码。
  • 例如,在你的代码中,一旦执行了 continue,if n == 1: break 这一句就永远不会被执行,因为程序在到达这里之前已经被 continue 直接跳过了。
  • 如果没有 break,程序在每一轮循环中都会更新 n 的值,但永远无法通过 if n == 1 条件退出循环,导致程序继续无限运行。

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

使用道具 举报

发表于 2024-12-6 11:31:47 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2024-12-6 17:03 编辑
n = int(input("请输入一个自然数:"))
while n > 0:
    if n % 2 == 0:                                # 无条件执行【1.1】
        print(n, "/2 = ", n // 2, sep='')
        n = n // 2
    else:                                         # 无条件执行【1.2】
        print(n, "*3+1 = ", n * 3 + 1, sep='')
        n = n * 3 + 1
    if n == 1:                                    # 无条件执行【2】
        break

      在这个 while 循环中,无条件执行的是两个 if 语句,其他语句都是从属。【1.1】、【1.2】属于同一个 if ... else 结构,本身互斥,不需要 continue ,【2】位于循环末尾,没有任何需要略过的语句,所以,也不需要 continue 。
      我们知道,continue 会略过循环中剩余的语句直接返回,如果在【1.1】、【1.2】中使用 continue,则 【2】会被无条件略过,而【2】是循环的唯一出口,这样做会废弃循环出口,这就是死循环的根本原因。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 00:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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