`
chenjingbo
  • 浏览: 462896 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

函数式编程学习1 一个斐波那契数列计算引来的思维变化

 
阅读更多

第一种写法

def fib(n:Int):Int = {
  def loop(i:Int):Int = {
    i match {
      case 1 => 0
      case 2 => 1
      case _ => loop(i - 1) + loop(i - 2)
    }
    
  }
  loop(n)
}

     相信有一定的编程能力的人,写这么一个递归函数应该不难,也是与人的思维最相近的,但是很明显,两层递归对栈的消耗完全是指数级的,写完这个,后续一定会考虑如何优化. 尾递归优化是针对递归非常常用的优化方式,那么问题来了,如何对上述的代码进行可以尾递归的改造. 通常的做法也容易想,就是递归方法中存放中间结果.那么下一个版本的代码如下

 

第二种写法

def fib2(n:Int):Int = {
  @annotation.tailrec
  def loop(n:Int,pre:Int,current:Int):Int={
    if(n == 1){
      pre
    } else {
      loop(n-1,current,current+pre)
    }
  }
  loop(n,0,1)
}

 数组从0,1 开始,然后一共走N位,最后走到1的时候,就是pre的值. 

 

第三种写法

def fib3(n:Int):Int = {
  def loop(first:Int,second:Int):Stream[Int] = first #:: loop(second,first+second)
  
  loop(0,1).take(n).last
}

 

这个是用了scala里非常典型的stream ,这样的话,可以说既与一般人的思维方式相匹配,又避免了栈依赖过多的问题. 

 

 

总结

总体的感觉还是不到位,后续如果思维更加清晰了,再补充一下吧. 

 

分享到:
评论

相关推荐

    java初学者48个小例子.doc

    这种方法的定义和调用体现了Java中的函数式编程概念,将特定任务封装在独立的方法中,便于代码复用和模块化。 5. **类与对象**: - 【程序6】中的`deff`类就是一个简单的Java类,它包含了计算最大公约数的方法。类...

    Python基础教程详解(第二十五课)-初探list.doc

    例如,`l = [1, 1, 2, 3, 5, 8, 13]`创建了一个包含斐波那契数列前7项的列表。我们可以通过`print(l)`来输出这个列表,同时,可以使用`for`循环遍历并打印出列表的每一个元素: ```python for i in l: print(i) ``...

    严蔚敏 数据结构(C语言版) 教材 习题 答案 PFD

    7. **动态规划和递归**:这些高级编程技术在解决数据结构问题中经常用到,例如,斐波那契数列、最短路径问题等。 8. **数据结构设计与分析**:理解如何根据问题需求选择合适的数据结构,以及如何通过分析数据结构的...

    数据结构算法演示系统

    9. **递归与分治**:递归是函数自身调用自身的过程,常用于解决复杂问题,如斐波那契数列、汉诺塔等;分治策略则将大问题分解为小问题解决,如快速排序、归并排序等。 10. **动态规划**:动态规划用于解决具有重叠...

    learningDSA

    总的来说,"learningDSA"项目是一个全面的C++数据结构与算法学习资源,对于希望提升编程技能、准备面试或者进行软件开发的人来说,是一个宝贵的资料库。通过深入学习和实践,我们可以掌握这些基础知识,从而更好地...

    DSA_7

    不过,标签 "JupyterNotebook" 提示我们将讨论的内容可能通过 Jupyter Notebook 这一交互式编程环境来呈现,这通常用于数据分析、机器学习或者教学目的。由于没有具体的内容概述,我将基于常见的数据结构和算法知识...

Global site tag (gtag.js) - Google Analytics