1. 多重循环的定义
多重循环(也称为嵌套循环)是指在一个循环语句的循环体内部,再包含另一个或多个循环语句。简单来说,就是 “循环里套循环”。外层循环执行一次,内层循环会完整执行一轮,直到内层循环条件不满足后,再继续执行外层循环的下一次迭代。
(一 )多重循环的基本使用
基本格式:
for ( 循环变量 <- 数据集) {
for(){
for(){
}
}
}
说明:
1.for可以替换成while循环。
2.循环的嵌套可以有多个,数量不限。
3.里外层循环执行的次数不相同。
编码示例:
for (i <- 1 to 5){
println(i)
for(j <- 10 to 15){
print(i, j)
}
2. 多重循环的格式
以常见的 for 循环和 while 循环为例,基本格式如下(以两层循环为例,多层循环可依此嵌套):
(1)for 循环嵌套 for 循环
for 外层变量 in 外层可迭代对象:
# 外层循环体(非循环部分)
for 内层变量 in 内层可迭代对象:
# 内层循环体(受内外层循环控制)
# 外层循环体(非循环部分)
(2)while 循环嵌套 while 循环
外层条件初始化
while 外层循环条件:
# 外层循环体(非循环部分)
内层条件初始化
while 内层循环条件:
# 内层循环体
内层条件更新
外层条件更新
(3)for 与 while 混合嵌套
for 外层变量 in 外层可迭代对象:
内层条件初始化
while 内层循环条件:
# 内层循环体
内层条件更新
# 外层循环后续操作
3.多重循环的注意事项
- 循环层次不宜过多:通常建议嵌套不超过 3 层,否则代码可读性会大幅下降,逻辑容易混乱。
- 内外层循环变量避免重名:若变量名相同,内层变量会覆盖外层变量,导致逻辑错误(尤其在
for循环中)。
# 错误示例:变量名重复
for i in range(3):
for i in range(2): # 内层i覆盖外层i
print(i)
- 内层循环的执行频率:外层循环执行
n次,内层循环每次执行m次,则内层总执行次数为n*m,需注意性能问题(数据量大时可能耗时)。 - 循环控制语句的影响范围:
break和continue仅作用于当前所在的循环层,不会直接影响外层循环。
for i in range(3):
for j in range(3):
if j == 1:
break # 仅跳出内层循环,外层循环继续
print(i, j)
5.初始化位置:内层循环的初始化语句(如 while 循环的条件变量)需放在外层循环内部,否则内层循环可能只执行一次。
# 错误示例:内层初始化在外层循环外
i = 0
j = 0 # 错误:j初始化在外层,内层循环只会执行一次
while i < 3:
while j < 2:
print(i, j)
j += 1
i += 1
- 逻辑清晰化:复杂逻辑可拆分到函数中,或通过注释说明各层循环的作用,提高可维护性。
今日课程练习
输出特殊图形
【讲解任务】编写代码打印输出如下图形:
1
22
333
4444
55555
for(i <- 1 to 5){
for(j <-1 to i){
println(s"${i}")
}
println()
}
打印九九乘法表
object MultiplicationTable {
def main(args: Array[String]): Unit = {
// 使用双层for循环生成九九乘法表
for (i <- 1 to 9) {
for (j <- 1 to i) {
printf(s"$j×$i=${i*j}\t") // 使用制表符对齐
}
println() // 每行结束后换行
}
}
百鸡白钱问题
[提问]:数学上怎么求?
[思路]:暴力破解
1. 列出公鸡,母鸡,小鸡的所有组合数量;
2. 计算这些组合是否符合100钱的要求。
[步骤,边讲边写代码演示]
1. 通过两层for循环,列出所有组合。这儿有两个变量:公鸡数量,母鸡数量;小鸡数量用100减出即可。
2. 判断是否满足100钱
3. 判断小鸡数是否是3的整数倍。
for(gj <- 1 to 20) {
for(mj <- 1 to 33){
val xj = 100 - gj - mj
if(xj % 3 == 0 && 5*gj + 3*mj + xj/3 == 100){
println(gj, mj, xj)
}
}
}