Skip to content

循环的艺术:嵌套循环

在编程的世界里,循环就像我们重复做一件事。而嵌套循环,就像在一个大循环里又套了一个小循环,让我们可以处理更复杂的问题。简单来说,当一个循环结构完全包含在另一个循环结构之内时,我们就称之为嵌套循环。

这意味着,外面的循环每执行一次,里面的循环就要完整地执行一遍。如果外层循环执行 n 次,内层循环执行 m 次,那么内层循环里的代码总共会被执行 n * m 次。这个概念很重要,理解了它,你就掌握了处理多层重复任务的关键。

让我们通过一个例子来直观地感受一下嵌套循环的力量。

实例演练:计算阶乘

假设我们需要计算从 110 这十个数字的阶乘,并把结果打印出来。阶乘是指从 1 乘到这个数本身,比如 5 的阶乘就是 1 * 2 * 3 * 4 * 5 = 120。

代码实现

python
for n in range(1, 11):
    factorial = 1  # 初始化阶乘结果
    for i in range(1, n + 1):
        factorial *= i  # 计算阶乘
    print(n, "! =", factorial) # 输出结果

运行结果

1 ! = 1
2 ! = 2
3 ! = 6
4 ! = 24
5 ! = 120
6 ! = 720
7 ! = 5040
8 ! = 40320
9 ! = 362880
10 ! = 3628800

在这个例子中,外层循环负责遍历 1 到 10 这十个数字,内层循环则负责计算每个数字的阶乘。对于每一个外层循环的数字 n,内层循环都会从 1 乘到 n,最终得到 n 的阶乘。

循环控制:break 语句在嵌套循环中的作用

break 语句可以在循环执行的过程中提前退出循环。但是,当 break 语句出现在嵌套循环的内层循环时,它只会结束内层循环的执行,而不会对外层循环产生任何影响。

为了更好地理解这一点,我们来看一个使用 break 语句的例子:找出 2 到 40 之间的所有素数。素数是指只能被 1 和自身整除的数,比如 2, 3, 5, 7, 11 等。

代码实现

python
for n in range(2, 40):
    i = 2
    # 优化:检查到 sqrt(n) 即可,这里为简化,检查到 n/2
    while i <= n / 2:
        if n % i == 0:
            break  # 如果找到因子,则不是素数,跳出内层循环
        i += 1
    # 如果内层循环正常结束(没有 break),则 i 会大于 n/2
    # 或者 n 本身小于等于 3 (2, 3 是素数)
    else:  # while 循环的 else 子句
        print(n, "是素数")

代码解析

  • 外层循环: for n in range(2, 40) 负责遍历 2 到 39 之间的所有数字,逐个判断它们是否为素数。
  • 内层循环: while i <= n / 2 负责检查当前数字 n 是否能被 2 到 n/2 之间的任何数字整除。实际上,我们只需要检查到 sqrt(n) 即可,这里为了简化,仍然检查到 n/2,因为如果一个数不是素数,它一定有一个小于等于它平方根的因子。
  • break 语句: 如果在内层循环中找到 n 的因子,就说明 n 不是素数,此时 break 语句会立即结束内层循环的执行。
  • else 子句: 这里的 else 子句是 while 循环特有的。只有当 while 循环正常结束(即循环条件变为 False 而不是被 break 语句中断)时,才会执行 else 子句中的代码。这意味着,如果内层循环没有找到 n 的因子,else 子句就会被执行,从而打印出 n 是素数的消息。

运行结果

2 是素数
3 是素数
5 是素数
7 是素数
11 是素数
13 是素数
17 是素数
19 是素数
23 是素数
29 是素数
31 是素数
37 是素数

通过这个例子,我们可以看到 break 语句在嵌套循环中的作用:它只能结束当前所在的循环,而不会影响外层循环的执行。同时,while...else 结构可以帮助我们更清晰地表达“如果没有找到因子,则... ”这样的逻辑。这两种工具结合起来,可以让我们编写出更加简洁、高效的循环代码。

掌握了嵌套循环和 break 语句的用法,你就拥有了解决更复杂编程问题的利器。