多重循环

47 阅读3分钟

多重循环的例子:

当有一个双重配套循环想要观察输出几次,可以敲出以上代码:



object base26 {
  def main(args: Array[String]): Unit = {
    for (i <- 1 to 5) {
     println(i) // 输出几次? 它由哪个循环变量的值所决定?
      for (j <- 10 to 15) {
       println(i,j)
     }
   }
  }
}

运行结果如图所示:

image.png 可以看出,println(i)是外层的for循环,它可以输出(1,2,3,4,5)由循环变量i的值所决定。 println(j)是里层的for循环,会根据外层的循环变量i输出的结果改变,因为println(j)会执行6次,所以总共会执行30次,由外层循环变量i和内层循环变量j共同决定。

当我在上面的双重循环里面再加一个循环将它变成三重,可以敲出以下代码:


object base26 {
  def main(args: Array[String]): Unit = {
    var k = 0
    for (i <- 0 to 5) { // 外层循环

     println(i) // 输出几次? 它由哪个循环变量的值所决定?

      for (j <- 10 to 15) { // 内层循环
        k = k + 1
       println(k,i,j) // 输出几次,它由什么值决定
     }
   }
  }
}

运行结果如图所示:

image.png 循环变量i和循环变量j上面有同理,外层循环执行6次,每次外层循环时内层循环执行10次,所以println(k, i, j)会输出 10×20=200 次,输出次数由外层循环变量 i 和内层循环变量 j 的值共同决定,同时还涉及变量 k(不过从代码片段看 k 初始值等未完全展示,但次数由 i 和 j 循环次数决定),会依次输出不同 k、i、j 组合的值

当我想要对12345做出一些循环时,可以输出以下代码:

/**
 * println("1")
 * println("22")
 * println("333")
 * println("4444")
 * println("55555")
 *
 * 11111
 * 2222
 * 333
 * 44
 * 5
 *
 * 1
 * 12
 * 123
 * 1234
 * 12345
 *
 */

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

运行结果如图所示:

image.png

当我需要弄出一个99乘法表时,根据格式

可以敲击以下代码:



object base28 {
  def main(args: Array[String]): Unit = {

    for (i <- 0 to 9) {
      for (j <- 1 to 9) {
//        printf(s"${j}${i}=${i*j} *)
        printf("%d*%d=%-4d", j, i, i*j)

        /**
         * %d: 占位置, 会输出一个整数
         * %-4d: 占位置, 会输出一个整数, 一共占据4个字符的空间大小, 左对齐;
         * %4d: 占位置, 会输出一个整数, 一共占据4个字符的空间大小, 左对齐;
         */
      }
      println()
   }
  }
}

运行结果如图所示:

image.png

鸡的数量问题

当我需要求出一些未知的数量时,可以敲击以下代码:


object base29 {
  def main(args: Array[String]): Unit = {
    // 百鸡百钱
    /**
     * 设公鸡 x,鸡母 y 只,小鸡是 100-x-y。
     * 同时 0 <= x <= 20,0 <= y <= 33
     *
     *    5x + 3y + (100 - x - y) / 3 = 100 (1)
     *
     *
     *   暴力求解
     *   1.(0,0,100) 代入(2)看看是否成立?
     *   2.(0,1,99) 代入(2)看看是否成立?
     *   3.(33,33,37) 代入(2)看看是否成立?
     */
    var k = 0
    for (x <- 0 to 20) {
      for (y <- 0 to 33) {
        val z = 100 - x - y
        // 代入 (1)
        if (5 * x + 3 * y + z / 3 == 100) {
          k += 1
          println(x, y, z)
        }
      }
    }
  }
}

可以直接看出结果如图所示,问题在代码上面:

image.png