Scala中循环语句for循环

56 阅读2分钟

我们来看一种更加简洁的循环:for循环

分为下面五个部分:

1.for循环的基本使用

2.for循环守卫

3.循环步长

4.循环的返回值

5.continue语句

问题导入例如:小球从100米高处自由落下,着地后又弹回高度的一半再次落下,如此重复。问经过多少次落地后,小球弹起的高度才会低于0.5米?

运用while循环

object Main {
  def main(args: Array[String]): Unit = {
    var height = 100.0  // 初始高度100米
    var count = 0       // 落地次数
    
    println("小球弹跳过程:")
    println(f"初始高度:$height%.2f米")
    
    while (height >= 0.5) {
      count += 1
      height = height / 2  // 弹起高度是前一次的一半
      println(f"第$count次弹起高度:$height%.2f米")
    }
    
    println(s"\n经过 $count 次落地后,小球弹起高度低于0.5米")
    println(f"第$count次弹起高度:$height%.4f米")
  }
}

运用for循环和break

import scala.util.control.Breaks._

object Main {
  def main(args: Array[String]): Unit = {
    var height = 100.0
    var count = 0
    
    println("小球弹跳过程:")
    breakable {
      for (i <- 1 to 100) { // 设置一个足够大的上限
        count = i
        height = height / 2
        
        if (height < 0.5) {
          println(f"第$count次弹起高度:$height%.4f米 < 0.5米")
          break
        } else {
          println(f"第$count次弹起高度:$height%.2f米")
        }
      }
    }
    
    println(s"\n答案:经过 $count 次落地后,小球弹起高度低于0.5米")
  }
}

(一)for循环

标准格式是:

[for ( 循环变量 <- 数据集) {]()  
  // 循环体代码  
}

说明:

1.如果循环变量的类型能被推断出来,是可以省略掉变量类型的。

2.这里的数据集可以是任意类型的数据集合,如字符串,集合,数组等等。

例如输出1~100间的偶数

object Main {
  def main(args: Array[String]): Unit = {
    // 输出1 ~ 100 中的偶数
    for (i <- 1 to 100) {
      if (i % 2 == 0) {
        println(i)
      }
    }
  }
}

(二)循环守卫

可以在循环中添加条件,如果条件成立就执行循环。这个叫循环守卫。

例如1~100中能同时被2、3、4整除的数

object Main {
  def main(args: Array[String]): Unit = {
    println("1~100中能同时被2、3、4整除的数:")
    
    for (i <- 1 to 100) {
      if (i % 2 == 0 && i % 3 == 0 && i % 4 == 0) {
        println(i)
      }
    }
  }
}

(三)循环步长

循环步长就是每次循环之后,循环变量的自增数值。

例如输出1~100中的奇数

object Main {
  def main(args: Array[String]): Unit = {
    println("1~100中的奇数(使用步长):")
    
    // 从1开始,步长为2,直接遍历所有奇数
    for(i <- 1 to 100 by 2) {
      println(i)
    }
  }
}

(四)循环的返回值

for也可以获取到返回值,使用yield

例如

import scala.util.control.Breaks._(此代码无需手动打出,系统会自动补充)

object Main {
  def main(args: Array[String]): Unit = {
    /**
     * break跳出整个for循环
     * 格式:
     * breakable {
     *   for(循环变量 <- 起点 to 终点) {
     *     break
     *   }
     * }
     */
    
    breakable {
      for (i <- 1 to 100) {
        // 如果遇到了第一个能整除9的数字就提前结束循环
        if (i % 9 == 0) {
          println(s"遇到第一个能被9整除的数:$i,循环结束")
          // 结束循环
          break
        }
        println(i)
      }
    }
    
    println("循环后的代码继续执行")
  }
}

判断是否为素数

import scala.util.control.Breaks._

object Main {
  def main(args: Array[String]): Unit = {
    val n = 97
    // 假设它是素数
    var isPrime = true
    
    breakable {
      for (i <- 2 to n-1) {
        if (n % i == 0) { // 检查整除,结束循环
          println(s"$i 能整除 $n")
          isPrime = false
          break
        }
      }
    }
    
    if (isPrime) {
      println(s"$n 是素数")
    } else {
      println(s"$n 不是素数")
    }
  }
}
import scala.util.control.Breaks._

object Main {
  def main(args: Array[String]): Unit = {
    val n = 97
    println(s"判断 $n 是否是素数:")
    println(s"需要检查 2 到 ${math.sqrt(n).toInt} 之间的数")
    
    var isPrime = true
    var checkedCount = 0
    
    breakable {
      for (i <- 2 to math.sqrt(n).toInt) {
        checkedCount += 1
        if (n % i == 0) {
          println(s"✓ 发现 $i 能整除 $n")
          println(s"$n = $i × ${n/i}")
          isPrime = false
          break
        } else {
          println(s"  $i 不能整除 $n")
        }
      }
    }
    
    println(s"共检查了 $checkedCount 个数")
    if (isPrime) {
      println(s"✓ $n 是素数")
    } else {
      println(s"✗ $n 不是素数")
    }
  }
}

(五)continue

在scala中是没有break和continue关键字的,如果一定要用,可以用scala.util.control包下的Breaks类的break

[import scala.util.control.Breaks._]()  
object MainFor {  
  def main(args: Array[String]): Unit = {  
     for(i <- 1 to 10){  
       breakable {  
         if(i%3 == 0){  
           //         continue  
           break  
         }  
         println(i)  
       }  
     }  
  }  
}

将breakable写在for循环内部,就是continue!