什么是斐波那契数列?
斐波那契数列(fibonacco number)指的是这样一个数列:0,1,1,2,3,5,8.....
这个数列从第3项开始,每一项都等于前两项之和。
知道了什么是斐波那契数之后,接下来就要开始编程实现求第n个裴波那契数了,即当输入为1时,返回的结果为1,输入4时,返回的结果为3等。
思路分析:
算法1:既然要求第n个斐波那契数,斐波那契数列的特点是从第三项开始每一项都等于前两项之和,满足第n个数 = (n - 1) + (n-2)。
在这里如果对递归比较熟悉的话应该马上就能想到该怎么解决这个问题了,下面简单介绍一下如何用递归解决这个问题。
简单回顾一下递归:递归在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。也就是说,递归算法是一种直接或间接调用自身的算法。其实质是把问题分成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解。
递归的三个分解步骤
- 明确咱们的函数具体要做什么:在这里我们需要求出第n个斐波那契数,所以我们的函数是要接收一个值返回一个结果值的,可以先写为int fib_n(int n){ }。
- 找到递归的结束条件:因为从第三项开始才满足后一项是前两项之和的,所以当n = 0 (返回0)或者 n = 1(返回1)的时候就可以停止递归了。
- 找到函数的等价关系式:题目中很明显的关系是:f(n) = f(n-1) + f(n-2) (n>=2)。
具体实现代码:
public class nFibonacco {
public static void main(String[] args) {
System.out.println(nfib_a(0));
System.out.println(nfib_a(1));
System.out.println(nfib_a(2));
System.out.println(nfib_a(3));
System.out.println(nfib_a(4));
System.out.println(nfib_a(5));
System.out.println(nfib_a(6));
}
//求第N个斐波那契数
//算法1:
public static int nfib_a(int n){
if (n <= 1)
return n;
return nfib_a(n - 1) + nfib_a(n-2);
}
}
运行结果:
运行过程分析:
假如我们要求第5个斐波那契数,则递归调用的过程如图所示,图中序号表示顺序。
算法2:采用递归的算法在n值较小的情况下是可行的,但是一旦n值过大(比如100以上),递归算法的性能就会出现问题,运算速度慢的缺点将暴露无遗,甚至容易导致栈溢出而崩溃或假死。下面是另一种常规算法:
//算法2:
public static int nfib_b(int n){
if (n <= 1)
return n;
int fisNum = 0; //第一个数
int secNum = 1; //第二个数
int result = 0; //结果值
for (int i=1; i<n;i++ ){
result = fisNum + secNum; //根据规律一个数等于前两个数的和
fisNum = secNum; //让原来的第二个数充当第一个数
secNum = result; //把结果值充当第二个数
}
return result;
}
运行结果:
算法性能的比较:通过比较算法1随着n值的增大速度会越来越慢,当n值仅仅为40时就需耗时3秒多,而算法2耗时为0秒,当n值大于50时,算法1直接崩溃,而算法2依旧耗时0秒,所以综合看来算法2的性能要强于算法1的性能。