斐波那契数列 - 递归和递归优化
斐波那契数列,即兔子问题;算法笔试题可能会出现;
function fun($n){ if($n==1||$n==2){ return 1; }
return fun($n-1) + fun($n-2); }
性能问题: 1,自身嵌套太深,可能会引起堆栈溢出;
堆栈溢出:函数调用会使用栈来保存临时变量。每调用一个函数,都会将临时变量封装为栈帧压入内存栈,等函数执行完成返回时,才出栈。系统栈或者虚拟机栈空间一般都不大。如果递归求解的数据规模很大,调用层次很深,一直压入栈,就会有堆栈溢出的风险。
2,重复计算,拖慢计算速度;
优化方面:
1,递归方式的优化:
$a = 1; $b = 1; function fun($a, $b, $n){ if($n > 2){ return fun($a+$b, $a, $n-1); } return $a; }
2,非递归方式:
function fun($n){ if($n==1||$n==2){ return 1; } $a = $b = 1; for($i=2; $i<$n; $i++){ $temp = $b; $b += $a; $a = $temp; } return $b; }
测试 n = 20 的时候的结果:
// 递归未优化 值:6765 执行时间:0.00088596343994141 递归次数:13529 // 递归优化 值:6765 执行时间:4.0531158447266E-6 递归次数:19 // 非递归 值:6765 执行时间:3.0994415283203E-6 递归次数:1
综上所述,性能方面: 非递归 > 优化的递归 > 未优化后的递归
你的坚持 ------ 终将美好 ~