记在年初面试做面试题出了一道关于计算斐波那契值问题
题上给出的是用下面递归的方法计算出来的值
function fib_recursive($n){
return ($n==0 || $n==1)?1:fib_recursive($n-1)+fib_recursive($n-2);
}
说出算法存在的不足之处和改进算法
一开始看这道题的时候是不是觉得这样写是正确的,没神马问题,我当时也没有想到这个算法有什么问题,更别说怎么优化了
今天在看代码大全2的时候忽然发现了答案,下面给出作者的原话:
在计算机教书中存在这样的缺陷,那就是用愚蠢的例子来讲解递归。典型的例子就是计算阶乘或者斐波那契数列。递归是一种强有力的工具,但是把它用在这两者中的任何一个都是愚蠢之极的,如果为我工作的程序员用递归去计算阶乘我宁愿换人。除了速度缓慢,并且无法预测运行期间的内存使用情况之外,用递归写出的子程序摇臂循环写出的子程序更难理解。
下面是用循环写出的:
function fib_recursive($n){
$arr=[];
for($i=0;$i<=$n;$i++)
{
if($i==0 || $i==1){
$arr[$i]=1;
}else{
$arr[$i]=$arr[$i-1]+$arr[$i-2];
}
}
return $arr[$n];
}
上面的内容都是自己打出来的,如有错误,还请海涵。。。