Scala的内建控制-多重循环

59 阅读4分钟

多重循环的基本使用

格式注意

1.for可以替换成while循环。

2.循环的嵌套可以有多个,数量不限。

3.里外层循环执行的次数不相同。

代码如下:

for ( 循环变量 <- 数据集) {  
  for(){  
    for(){  
    }  
  }  
}

代码示例:

object for05 {
  def main(args: Array[String]): Unit = {
    var k = 0
    for (i <- 1 to 5){
      println(i)  // 输出5次,由 i 循环变量的值所决定?
      for (j <- 10 to 15){
        k = k + 1
        println(i,j) //输出30次,由i , j循环变量的值决定
      }
    }
  }
}

1,输出特殊图形

编写代码打印输出如下图形:

1

22

333

4444

55555

要求:

1.每行的数字个数都不相同,完成一行输出之后可以换行。

2.使用外层循环控制每行的重复次数,使用内层循环控制每行的具体内容。

实行代码如下:

object for06 {
  def main(args: Array[String]): Unit = {
    for (i <- 1 to 5){ //外层循环
      for (j <- 1 to i){// 每行输出几个数字
        print(i)
      }
      println()// 换行
    }
  }
}

2,打印乘法口诀表

思路:

1. 先观察每个式子的结构

2. 再观察每行的结构。

3. 使用双层for循环,写出一个矩形结构。

开始代码为:

object for07 {
  def main(args: Array[String]): Unit = {
    for (i <- 1 to 9){
      for (j <- 1 to 9){
        printf("%d×%d=%-4d", j , i , i*j)
      }
      /**
       * %d: 占位符,会输出一个整数
       * %-4d:占位符,会输出一个整数,一共占据四个字符的空间大小,左对齐
       * %4d:占位符,会输出一个整数,一共占据四个字符的空间大小,右对齐
       */
      println()
    }
  }
}

输出内容如下:

1×1=1   2×1=2   3×1=3   4×1=4   5×1=5   6×1=6   7×1=7   8×1=8   9×1=9   
1×2=2   2×2=4   3×2=6   4×2=8   5×2=10  6×2=12  7×2=14  8×2=16  9×2=18  
1×3=3   2×3=6   3×3=9   4×3=12  5×3=15  6×3=18  7×3=21  8×3=24  9×3=27  
1×4=4   2×4=8   3×4=12  4×4=16  5×4=20  6×4=24  7×4=28  8×4=32  9×4=36  
1×5=5   2×5=10  3×5=15  4×5=20  5×5=25  6×5=30  7×5=35  8×5=40  9×5=45  
1×6=6   2×6=12  3×6=18  4×6=24  5×6=30  6×6=36  7×6=42  8×6=48  9×6=54  
1×7=7   2×7=14  3×7=21  4×7=28  5×7=35  6×7=42  7×7=49  8×7=56  9×7=63  
1×8=8   2×8=16  3×8=24  4×8=32  5×8=40  6×8=48  7×8=56  8×8=64  9×8=72  
1×9=9   2×9=18  3×9=27  4×9=36  5×9=45  6×9=54  7×9=63  8×9=72  9×9=81  

如何简化成九九乘法表

简化如下:

将内部循环的九改成i

object for07 {
  def main(args: Array[String]): Unit = {
    for (i <- 1 to 9){
      for (j <- 1 to i){//倒过来就是10-i
        printf("%d×%d=%-4d", j , i , i*j)
      }
      /**
       * %d: 占位符,会输出一个整数
       * %-4d:占位符,会输出一个整数,一共占据四个字符的空间大小,左对齐
       * %4d:占位符,会输出一个整数,一共占据四个字符的空间大小,右对齐
       */
      println()
    }
  }
}

成功输出九九乘法表:

1×1=1   
1×2=2   2×2=4   
1×3=3   2×3=6   3×3=9   
1×4=4   2×4=8   3×4=12  4×4=16  
1×5=5   2×5=10  3×5=15  4×5=20  5×5=25  
1×6=6   2×6=12  3×6=18  4×6=24  5×6=30  6×6=36  
1×7=7   2×7=14  3×7=21  4×7=28  5×7=35  6×7=42  7×7=49  
1×8=8   2×8=16  3×8=24  4×8=32  5×8=40  6×8=48  7×8=56  8×8=64  
1×9=9   2×9=18  3×9=27  4×9=36  5×9=45  6×9=54  7×9=63  8×9=72  9×9=81  

3,百鸡百钱问题

问题:

公鸡1只5钱,母鸡1只3钱,小鸡3只1钱,用100钱买100只鸡,问公鸡,母鸡,小鸡各有几只?

思路:

1,列出公鸡,母鸡,小鸡的所有组合数量;

2,计算这些组合是否符合100钱的要求。

代码示例如下:

object for08 {
  def main(args: Array[String]): Unit = {
    //百鸡百钱
    /**
     * 设公鸡 x,母鸡 y 只,小鸡是 100-x-y
     * 同时0 <= x <= 20 ,0 <= y <= 33
     * 5x + 3y + (100-x-y)/3 = 100
     * 暴力求解:
     * 一个一个代入进去试
     */
    var k = 0
    for (x <- 1 to 20){
      for (y <- 1 to 33){
        val z = 100 - x - y
        if(5*x + 3*y + z/3 == 100){
          k += 1
          println(k,x,y,z)
        }
      }
    }
  }
}

代码结果如下:

(1,3,20,77)
(2,4,18,78)
(3,7,13,80)
(4,8,11,81)
(5,11,6,83)
(6,12,4,84)