在课程scala教程中,大多数示例都使用自上而下的迭代.部分地,正如我所看到的,迭代用于避免for/while循环.我来自C++,对此感到有些困惑.
迭代选择for/while循环吗?它在生产中是否实用?堆栈溢出的风险是什么?效率怎么样?自下而上动态编程怎么样(特别是当它们不是尾部重复时)?
另外,我应该使用更少的"if"条件,而是使用更多"case"和子类?
我可以创建一个递归闭包:
static IntUnaryOperator fibo;
fibo =
(i) ->
i<2 ? 1 : fibo.applyAsInt(i-1)+ fibo.applyAsInt(i-2);
Run Code Online (Sandbox Code Playgroud)
但当然,它只是作为一个例子.相反,如果我创建了一个惰性/无限列表/流,则可以以非常好的方式使用递归:不必多次计算任何成员.
我想到了以下结构:
IntStream fi;
fi=IntStream.iterate(0, i -> fi[i-1]+fi[i-2]);
Run Code Online (Sandbox Code Playgroud)
但是那样它就行不通了 - 我无法通过索引从流中获取一个项目.另一个问题是,如果我以后再沿着流,它将被消耗,我不能重复使用它.如果我将流复制到List,它就不再是懒惰了.
因此,我需要一些我可以通过索引解决的构造.作为fibo(i).
编辑.显然,解决方案不能是流,因为流不能使用两次.我不想在每次调用F(i)时重复所有计算.
在尝试熟悉FS2时,我遇到了一个使用Scala集合的Stream 的漂亮的递归实现,并且认为我在FS2中尝试它:
import fs2.{Pure, Stream}
val fibs: Stream[Pure, Int] = Stream[Pure, Int](0) ++ fibs.fold[Int](1)(_ + _)
println(fibs take 10 toList) // This will hang
Run Code Online (Sandbox Code Playgroud)
FS2中出现这种情况的原因是什么,以及获得类似工作解决方案的最佳方法是什么?