zoukankan      html  css  js  c++  java
  • php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习)

    php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习)

    一、总结

    1、递归不优化的话,30层开外就有点吃力了

    2、php因为定义变量的时候不用定义变量类型,所以数组里面的类型也是php自动选择,这就会有下面的情况:

    当int不够的时候自动转化为float,float不够的时候自动转化为科学计数法

    二、php实现记忆化递归--以斐波那契数列为例

    大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。

    三、代码

    代码一

     1 <?php
     2 
     3 $arr = array(0,1,1);
     4 for($i=3;$i<=100;$i++){$arr[$i]=-1;}
     5 function Fibonacci($n)
     6 {
     7     global $arr;
     8     if($arr[$n]!=-1) return $arr[$n]; //1、边界情况都可以结合 记忆化递归数组判断,对比一下下面的代码就知道简便之处了
     9     else{
    10         $arr[$n-1]=$arr[$n-1]!=-1?$arr[$n-1]:Fibonacci($n-1);
    11         $arr[$n-2]=$arr[$n-2]!=-1?$arr[$n-2]:Fibonacci($n-2);
    12         return $arr[$n]=$arr[$n-1]+$arr[$n-2];
    13     }
    14 }

    代码二

     1 <?php
     2 namespace appindexcontroller;
     3 
     4 use appindexcontrollerBase;
     5 
     6 class Exercise extends Base
     7 {
     8     public function index()
     9     {
    10         $this->FibonacciDemo();
    11     }
    12 
    13     //斐波那契数列 
    14     private $arr = array();//记忆化递归数组
    15     public function Fibonacci($n)
    16     {
    17         global $arr;
    18         if($n==0) return 0;
    19         else if($n==1||$n==2) return 1; //1、php中的逻辑连接符:和java一样,例如|表示位运算符,||表示逻辑运算符
    20         else{
    21             $arr[$n-1]=$arr[$n-1]!=-1?$arr[$n-1]:$this->Fibonacci($n-1);
    22             $arr[$n-2]=$arr[$n-2]!=-1?$arr[$n-2]:$this->Fibonacci($n-2);
    23             return $arr[$n]=$arr[$n-1]+$arr[$n-2]; //2、支持这样的返回方式,这应该是先赋值再返回  3、把求出的值给记录下数组,刚刚忘记记录$arr[$n]了
    24         }
    25     }
    26     public function FibonacciDemo(){
    27         global $arr;
    28         for ($i=0; $i <100 ; $i++) { 
    29             $arr[$i]=-1;
    30         }
    31         $arr[0]=0;
    32         $arr[1]=1;
    33         $arr[2]=1;
    34         echo($this->Fibonacci(50));
    35         dump($arr);die;
    36     }
    37 
    38 }

    截图:

  • 相关阅读:
    30天敏捷结果(17):找出高效时间,并利用它来处理重要事情
    需求:需求获取技术之 观察
    30天敏捷结果(13):如何对事情付诸行动
    2010年11月blog汇总:敏捷练习、需求和建模
    MDSF:Eclipse MDD Day学习
    需求:结合TOGAF做好需求获取工作
    MDSF:架构工具简要功能说明
    信息系统开发平台OpenExpressApp:【OpenTest】 之 框架实现说明
    吃:第二次去吃香草香草
    30天敏捷生活(911):调整30天的节奏
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/9035402.html
Copyright © 2011-2022 走看看