首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数式编程: scala中递归循环输出fibonacci序列

函数式编程: scala中递归循环输出fibonacci序列
EN

Stack Overflow用户
提问于 2015-02-13 13:09:44
回答 2查看 1.1K关注 0票数 2

使用scala学习函数式编程。偶然发现了这个练习。

编写一个递归函数来获得第n个斐波那契数(http://mng.bz/C29s)。前两个Fibonacci数字是0和1。第n个数字始终是前两个数字的总和-序列从0,1,1,2,3,5开始。您的定义应该使用局部尾递归函数。

代码语言:javascript
复制
def fib(n: Int): Int

我的答案计算n+1值并返回第n个。谁能给我展示一个不计算额外n+1th值的更好的实现?

代码语言:javascript
复制
object patterns {

    def fib(n : Int): Int = {
        @annotation.tailrec
        def go(n: Int, prev2: Int, prev: Int): Int =
            if(n<=0) prev2 
            else go(n-1, prev, prev2+prev)
        go(n, 0, 1)
      }
}

如果有人感兴趣,这是来自Chiusano和Bjarnason的书“在scala中的函数式编程”。练习2.1期待您的回复。

EN

回答 2

Stack Overflow用户

发布于 2015-02-13 16:54:57

我认为:

代码语言:javascript
复制
def fib2(n: Int): Int = {
  if (n < 1) 0
  else if (n < 2) 1
  else {
    @annotation.tailrec
    def go(i: Int, prev2: Int, prev: Int): Int =
      if (i == n) prev
      else go(i + 1, prev, prev2 + prev)
    go(2, 1, 1)
  }
}

或者使用ByName参数:

代码语言:javascript
复制
def fib3(n: Int): Int = {
  @annotation.tailrec
  def go(n: Int, prev2: Int, prev: => Int): Int =
    //                            ^ ByName
    if (n <= 0) prev2
    else {
      val p = prev
      go(n - 1, p, prev2 + p)
    }
  go(n, 0, 1)
}
票数 2
EN

Stack Overflow用户

发布于 2015-02-13 17:38:36

我喜欢使用stream来实现它。因为代码更短,更容易理解。

代码语言:javascript
复制
      def fibo():Stream[Int] = {
        def addRec(o1:Int,o2:Int):Stream[Int] = {
          o1 #:: addRec(o2,o1 + o2)
        }
        addRec(1,1)
      }

      println(fibo().take(100).toList)  

调用fibo.drop(n-1)(0)很容易获取nth

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28492880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档