第一种写法
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 ,这样的话,可以说既与一般人的思维方式相匹配,又避免了栈依赖过多的问题.
总结
总体的感觉还是不到位,后续如果思维更加清晰了,再补充一下吧.
相关推荐
"Fibonacci数列斐波那契数列PPT学习教案.pptx" Fibonacci数列是一种非常重要的数学概念,它的应用非常广泛,包括生物学、经济学、计算机科学等领域。下面我们将详细介绍Fibonacci数列的概念、性质和应用。 1. ...
斐波那契数列是一个经典的数学概念,在计算机科学中经常被用作算法示例和问题解决的工具。这个数列的定义是这样的:第一项F0等于0,第二项F1等于1,从第三项开始,每一项都等于前两项之和。即Fn = Fn-1 + Fn-2 (n >=...
斐波那契数列是一个经典的数学概念,由意大利数学家斐波那契在13世纪提出,数列中的每一项都是前两项之和。在数列的开始,第一项是0,第二项是1,之后的每一项都等于前两项之和。斐波那契数列的前几项通常是:0, 1, ...
程序分析:斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、…… 在数学上,费波那契数列是以递归的方法来定义: F0 = 0 (n=0) F1 = 1 (n=1) Fn ...
【问题描述】编写函数f,功能是用递归的方法求斐波那契数列的第n项,函数原型为 int f(int n),在主函数中输入一个正整数n,调用函数f求出斐波那契数列的第n项,并在主函数中输出。 斐波那契数列:1,1,2,3,5,8,13,...
根据给定文件的信息,我们可以详细地探讨如何使用Java来实现Fibonacci数列,并通过具体的代码示例来深入了解这...通过学习这两种方法,我们可以更好地理解和掌握Fibonacci数列的相关知识,并将其应用于实际编程项目中。
综上所述,"斐波那契数列(前100项).rar"这个压缩包可能是为学习者提供一个参考,用于验证自己的代码是否正确计算出了前100项斐波那契数。通过这个例子,我们可以深入理解递归和非递归算法,以及如何在C语言中实现...
在数学上它以递归的方式进行定义,指这样的一个数列:0、1、1、2、3、5、8、13、21、34、55、89、144……,即前两个数为分别为0和1,从第3项开始,每项的值都等于其前两项之和。斐波那契数列Fib(n)用公式表示为: ...
下面是一个使用递归算法计算斐波那契数列的JAVA代码: public class Fib_ra{ public static int fibonacci(int n){ if(n>=0) if(n==0||n==1) return n; else return fibonacci(n-2)+fibonacci(n-1); return -1; } ...
斐波那契数列是一个经典的数学概念,其定义如下:第一项和第二项都是1,从第三项开始,每一项都等于前两项之和。用公式表示就是F(n) = F(n-1) + F(n-2),其中F(1) = 1,F(2) = 1。 在Android中,由于主线程负责处理...
斐波那契数列定义如下:序列中的第一个和第二个数字都是1(或0和1,具体取决于起始点的选择),之后每一个数字都是前两个数字的和。用数学公式表示就是: F(1) = 1, F(2) = 1, F(n) = F(n-1) + F(n-2) 对于 n > 2。...
本文档提供了两种计算斐波那契的C++代码函数,供网友使用,。主要讲cpp添加到新建项目中运行
在这个场景下,我们可以编写一个函数,它会根据斐波那契数列的定义来计算第n项的值。 Python中递归实现斐波那契数列的基本代码如下: ```python def fibonacci(n): if n print("输入错误,n应大于0") elif n =...
在Java开发工程师的笔试中,斐波那契数列是一个常见的题目,因为它可以考察候选人的逻辑思维、递归理解以及优化算法的能力。此外,斐波那契数列也常被用来讨论递归与迭代的效率差异,以及如何使用缓存或记忆化技术来...
斐波那契数列,又称为兔子数列,是由13世纪意大利数学家斐波那契提出的一个数学序列。这个数列的特点是每一项都等于前两项之和,起始的两项为1。具体地,斐波那契数列可以用递归公式表示:F0 = 1, F1 = 1, Fn = Fn-1...
本代码使用C++语言书写,编译环境VS2013。...斐波那契数列(Fibonacci Sequence)又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、…… 本代码是练习作品,如有错误或修改,请指正,感谢感谢。
斐波那契数列是由两个前一个数相加得到的数列,通常以0和1开始。 首先,我们看C语言部分。`fib`函数接收一个整数`N`,并返回一个整型数组,数组包含了从0到`N`的斐波那契数列。在函数内部,首先进行了输入检测,...
在计算机科学中,特别是硬件描述语言(HDL)如Verilog中,斐波那契数列的实现是一个常见的练习,用于学习和展示并行和串行计算的概念。 Verilog是一种广泛使用的硬件描述语言,它允许工程师用类似于编程语言的方式...
利用递归数列求解著名的Fibonacci数列的各项,用户可自定义输入要求的第n项,输入后即可求出从0到n每一项Fibonacci的值。
斐波那契数列(Fibonacci sequence)是数学中一个非常著名的数列,其特点是每一项数值都是前两项数值的和。通常情况下,斐波那契数列的第一项为0或1,第二项也为1,后续各项则根据定义递推得到。 **基本形式:** \...