如何在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()
}

我可以这样写

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

但是然后a和b将被暴露并且不再被封装在该方法内部。


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

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

[编辑]

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

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

这会产生无限多的斐波纳契数字,但是您可以根据需要从中获取尽可能多的数据,例如fib.take(10).toList


循环有自己的范围。 当你用递归函数替换一个循环时,你不得不创建一个明确的范围(内部方法)。 没有其他办法了。 这是如何完成的。 它没有错。

链接地址: http://www.djcxy.com/p/62775.html

上一篇: How to do recursive loops in scala

下一篇: Cors doesnt solve cross origin requests