如何在scala中执行递归循环

Spi*_*Pig 6 scala

我想知道是否有更好的方法在scala中编写递归循环.

def fib(n: Int) = {
  def loop(a: BigInt = 0, b: BigInt = 1, n: Int = n): BigInt = {
    if(n==0) a
    else loop(b, a+b, n-1)
  }
  loop()
}
Run Code Online (Sandbox Code Playgroud)

我可以这样写

def fib(n: Int, a: BigInt = 0, b: BigInt = 1): BigInt = {
  if(n==0) a
  else fib(n-1, b, a+b)
}
Run Code Online (Sandbox Code Playgroud)

但是然后a和b将被曝光并且不再封装在方法内部.

Lan*_*dei 3

请注意,在这种情况下您经常可以使用foldLeftor :foldRight

def fib(n: Int) = (1 to n).foldLeft((BigInt(0),BigInt(1)))((p,_)=>(p._2,p._1+p._2))._1
Run Code Online (Sandbox Code Playgroud)

[编辑]

另一种方法是基于迭代器的解决方案:

def fib = Iterator.iterate((0,1)){case (x,y) => (y,x+y)}.map(_._1)
Run Code Online (Sandbox Code Playgroud)

这会生成无限数量的斐波那契数,但您可以简单地从中获取任意数量的数,例如fib.take(10).toList