第一种写法
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中的函数式编程概念,将特定任务封装在独立的方法中,便于代码复用和模块化。 5. **类与对象**: - 【程序6】中的`deff`类就是一个简单的Java类,它包含了计算最大公约数的方法。类...
例如,`l = [1, 1, 2, 3, 5, 8, 13]`创建了一个包含斐波那契数列前7项的列表。我们可以通过`print(l)`来输出这个列表,同时,可以使用`for`循环遍历并打印出列表的每一个元素: ```python for i in l: print(i) ``...
7. **动态规划和递归**:这些高级编程技术在解决数据结构问题中经常用到,例如,斐波那契数列、最短路径问题等。 8. **数据结构设计与分析**:理解如何根据问题需求选择合适的数据结构,以及如何通过分析数据结构的...
9. **递归与分治**:递归是函数自身调用自身的过程,常用于解决复杂问题,如斐波那契数列、汉诺塔等;分治策略则将大问题分解为小问题解决,如快速排序、归并排序等。 10. **动态规划**:动态规划用于解决具有重叠...
总的来说,"learningDSA"项目是一个全面的C++数据结构与算法学习资源,对于希望提升编程技能、准备面试或者进行软件开发的人来说,是一个宝贵的资料库。通过深入学习和实践,我们可以掌握这些基础知识,从而更好地...
不过,标签 "JupyterNotebook" 提示我们将讨论的内容可能通过 Jupyter Notebook 这一交互式编程环境来呈现,这通常用于数据分析、机器学习或者教学目的。由于没有具体的内容概述,我将基于常见的数据结构和算法知识...