循环的艺术:嵌套循环
在编程的世界里,循环就像我们重复做一件事。而嵌套循环,就像在一个大循环里又套了一个小循环,让我们可以处理更复杂的问题。简单来说,当一个循环结构完全包含在另一个循环结构之内时,我们就称之为嵌套循环。
这意味着,外面的循环每执行一次,里面的循环就要完整地执行一遍。如果外层循环执行 n
次,内层循环执行 m
次,那么内层循环里的代码总共会被执行 n * m
次。这个概念很重要,理解了它,你就掌握了处理多层重复任务的关键。
让我们通过一个例子来直观地感受一下嵌套循环的力量。
实例演练:计算阶乘
假设我们需要计算从 1
到 10
这十个数字的阶乘,并把结果打印出来。阶乘是指从 1 乘到这个数本身,比如 5 的阶乘就是 1 * 2 * 3 * 4 * 5 = 120。
代码实现
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 等。
代码实现
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
语句的用法,你就拥有了解决更复杂编程问题的利器。