斐波拉切数列指的是这样一个数列:1、1、2、3、5、8、13、21、34·······由此可以得到如下的递推公式:
F(1) = 1, F(2) = 1, F(3) = F(2) + F(1) ······· 由此可以计算出第n项的值为: F(n) = F(n-1) + F(n-2) 。其使用递归和非递归的方式实现如下:
public class TestFee {
/**
* 递归方式
* @param n 要计算的第n项
* @return 返回计算的结果
*/
long fa(int n){
if(n == 1 || n == 2) return 1;
return fa(n-1)+fa(n-2);
}
/**
* 非递归方式
* @param n 要计算的第n项
* @return 返回计算的结果
*/
long cal(int n){
//使用变量i记录n-1项
long i = 1;
//使用变量j记录n-2项
long j = 1;
while(n >= 3){
//使用第三个变量k记录第n项的值
long k = i + j;
j = i;
i = k;
n--;
}
return i;
}
public static void main(String[] args) {
TestFee tf = new TestFee();
//1.使用递归方式
//long fa = tf.fa(15);
//System.out.println(fa);
//2.使用非递归方式
long cal = tf.cal(15);
System.out.println(cal);
}
}
以上两种方式都可以实现第n项的值的计算,但经过测试,当计算的n值比较大时(例如当n = 48时),会明显的看到使用递归的方式比使用非递归的方式性能要低下的多,所以在计算此问题时优先选择非递归的方式。
使用非递归性能低下的原因是:由于计算出第n项的值的方法为: F(n) = F(n-1) + F(n-2),由此递推公式可以看出,当n >= 3的时候,计算每一项都需要拆分成两项,而拆分的两个子项又需要各自拆分成两个子项,这样一来,如果计算的n比较大的时候,最终的计算式子会有很多项,而每一项都需要在内存中分配相应的空间,从而导致运算效率低下。
以上纯属个人见解,如有问题请多指教。