多重循环

226 阅读3分钟

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.多重循环的注意事项

  1. 循环层次不宜过多:通常建议嵌套不超过 3 层,否则代码可读性会大幅下降,逻辑容易混乱。
  2. 内外层循环变量避免重名:若变量名相同,内层变量会覆盖外层变量,导致逻辑错误(尤其在 for 循环中)。
# 错误示例:变量名重复
for i in range(3):
    for i in range(2):  # 内层i覆盖外层i
        print(i)
  1. 内层循环的执行频率:外层循环执行 n 次,内层循环每次执行 m 次,则内层总执行次数为 n*m,需注意性能问题(数据量大时可能耗时)。
  2. 循环控制语句的影响范围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. 逻辑清晰化:复杂逻辑可拆分到函数中,或通过注释说明各层循环的作用,提高可维护性。

今日课程练习

输出特殊图形

【讲解任务】编写代码打印输出如下图形:

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)  
    }  
  }  
}