下面的代码演示了两种求和值的方法,如果值达到5,则终止条件为:
object ob extends App {
def withoutRecursion = {
var currentTotal = 0.0;
while(5 > currentTotal){
currentTotal = currentTotal + scala.util.Random.nextFloat
println(currentTotal);
}
}
def withRecursion = {
var currentTotal = 0.0;
def whileLoop(cond : =>Boolean)(block : =>Unit) : Unit =
if(cond) {
block
whileLoop(cond)(block)
}
whileLoop(5 > currentTotal) {
currentTotal = currentTotal + scala.util.Random.nextFloat
println(currentTotal);
}
}
}
在这种情况下,withRecursion
方法是用函数编程风格替换while循环的惯用方法吗?
答案 0 :(得分:5)
不是真的。在您的示例中,您仍然使用var
来收集中间结果。那不是FP。
一个(很多)选项是创建一个无限但懒惰的Stream
来重复必要的计算。然后,如果您想要所有中间值takeWhile()
,或者只想最终结果dropWhile()
。
示例:
Stream.iterate(0F)(_ + util.Random.nextFloat).takeWhile(_ < 5)
这将创建一个有限Stream
,其中所有值从0.0到最大总和小于5.
另一方面......
Stream.iterate(0F)(_ + util.Random.nextFloat).dropWhile(_ < 5).head
...这将为您提供大于5的第一个结果。