zoukankan      html  css  js  c++  java
  • 斐波那契数列

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

    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

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

  • 相关阅读:
    PHP touch() 函数
    PHP tmpfile() 函数
    PHP tempnam() 函数
    PHP symlink() 函数
    PHP stat() 函数
    pt-table-sync
    P4233 射命丸文的笔记
    C# Task.Run 和 Task.Factory.StartNew 区别
    C# Task.Run 和 Task.Factory.StartNew 区别
    SourceYard 制作源代码包
  • 原文地址:https://www.cnblogs.com/pyspang/p/13781955.html
Copyright © 2011-2022 走看看