在Scala中处理while循环样式程序的最佳方法

时间:2017-12-21 00:39:23

标签: scala

我有一个用C ++编写的简单程序。它生成随机数,并在这些数字的总和等于或大于100时停止。代码如下:

vector<int> container;
while(container.sum() <100)
{
    int new_number = rand()%10 + 1 ;// generate a number in range 1 to 10
    container.push_back(new_number); // add new number to the container

}

在Scala中处理任务的最佳方法是什么? (不使用while循环?)

似乎FoldLeft或FoldRight功能在某种情况下无法突破?

4 个答案:

答案 0 :(得分:3)

创建一个无限Stream个随机数(只需要很少的CPU和内存),只需要你需要的东西,然后将结果Stream变成所需的集合类型。

val randoms = Stream.continually(util.Random.nextInt(10)+1)
val container = randoms.take(randoms.scan(0)(_+_).indexWhere(_>=100)).toVector

增加的奖金是总和是在你去的时候计算的,即加到前一个总和,而不是每次从头开始求和。

答案 1 :(得分:2)

这是使用尾递归函数处理while循环的一种方法,如下所示:

# running the copy statement
with open('/path/to/your/data/file.csv') as f:
     cursor.copy_expert(copy_from, file=f)

# don't forget to commit the changes.
connection.commit()

答案 2 :(得分:1)

以下是一种方法:

  val randomNumberGenerator = new scala.util.Random
  def sumUntil(list: List[Int]): List[Int] = list match {
    case exceeds if list.filter(_ > 0).sum > 100 => list
    case _ => sumUntil(list :+ (randomNumberGenerator.nextInt(10) + 1))
  }

解释解决方案:

  1. 创建scala.util.Random的实例,这将帮助我们生成随机数
  2. sumUntil会模式匹配;如果列表总和超过100,则返回。
  3. 如果总和不超过100,请再次调用sumUntil,但使用10和1(含)之间生成的另一个随机数。请注意,_表示,&#34;我不关心价值,甚至不关心类型。&#34; _是其他任何我们列表中所有整数之和大于100的情况。
  4. 如果您是Scala的新手,我明白看起来可能有点粗糙。以下是精致版本:

      val randomNumberGenerator = new scala.util.Random
    
      def sumUntil(list: List[Int]): List[Int] = list match {
        case exceeds if sumList(list) > 100 => list
        case _ => sumUntil(appendRandomNumberToList(list))
      }
    
      private def sumList(list: List[Int]): Int = {
        list.filter(_ > 0).sum
      }
    
      private def appendRandomNumberToList(list: List[Int]): List[Int] = {
        list :+ randomNumberGenerator.nextInt(10) + 1
      }
    

答案 3 :(得分:0)

  • 如果您的循环只是扫描整个集合,请使用fold或reduce。
  • 如果需要一些自定义终止条件,则优先考虑递归。
相关问题