斐波那契数列 - 递归和递归优化

斐波那契数列,即兔子问题;算法笔试题可能会出现;

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

综上所述,性能方面:  非递归 > 优化的递归 > 未优化后的递归 

posted @ 2020-10-08 17:10  一粒小米-博客  阅读(579)  评论(1编辑  收藏  举报