LEEFEI571 发表于 2024-12-5 23:27:41

分支语句课后练习的困惑

讲解分支语句的课后练习题如下:
验证角谷猜想
角谷猜想的内容是:任意给定一个正整数,若它为偶数则除以 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语句的话,程序运行起来就会进入到死循环(请见截图),这是为什么?烦请大神指点,谢谢!

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

小甲鱼的二师兄 发表于 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。

小甲鱼的二师兄 发表于 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 条件退出循环,导致程序继续无限运行。

jackz007 发表于 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】是循环的唯一出口,这样做会废弃循环出口,这就是死循环的根本原因。
页: [1]
查看完整版本: 分支语句课后练习的困惑