您的位置:首页 > 其它

递归求解斐波那契数列

2013-08-28 23:50 274 查看
数据结构与算法分析-C语言描述(笔记)这本书里的第9页提到了递归的四条基本法则,其中第四条是:

4.合成效益法则:在求解一个问题的同一实例时,切勿在不同的递归调用中做重复性的工作。

法则的应用:

求斐波那契数列最容易想到的就是递归调用了

long fib(int n){
if(n <= 1){
return 1;
}
else{
return fib(n - 1) + fib(n - 2);
}

}


可以看到上面的代码使用递归调用,其实这个方法在n稍微大点的情况下,效率会很低下。

这些是因为,这个方法违反了第四条法则。

计算fib(n)的时候会调用fib(n-1)和fib(n-2).

而计算fib(n-1)时会调用fib(n-2)和fib(n-3).

那么fib(n-2)被重复计算了。当n很大的时候,累积起来的重复计算很多。

所以在计算斐波那契数列的时候,不能采用递归方法

优化过后的递归方法:

private static void test19(){
int max = 13;
long[] templeResult = new long[max + 1];
System.out.println("f2(13):" + f2(max, templeResult));
}

private static long f2(int n, long[] templeResult){
if(n == 0){
return 0;
} else if(n == 1){
return 1;
} else if(templeResult
== 0){
System.out.println("n = " + n);
templeResult
= f2(n-1, templeResult) + f2(n-2, templeResult);
}
return templeResult
;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: