php实现变态跳台阶(记忆化递归)

php实现变态跳台阶(记忆化递归)

一、总结

1、本题思路(分类讨论思路,注意初始值和边界值):第一步如果1,那剩下的就是jumpFloorII($number-1)(下面jumpFloorII以j表示),第一步如果2,那剩下的就是j($number-2),...,以此类推

所以j(n)=j(n-1)+j(n-2)+...+j(0),其实j(n)就是2的n次方

二、php实现变态跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

三、代码

牛客网ac代码一:

 1 <?php
 2 
 3 $arr = array(1,1,2,4);//记忆化递归数组  1、$arr[0]=1而不是0
 4 for($i=4;$i<500;$i++) $arr[$i]=-1;
 5 function jumpFloorII($number)
 6 {
 7     global $arr;
 8     if($arr[$number]!=-1) return $arr[$number]; //2、这里的$arr忘记接[$number]
 9     $ans=0;
10     for($i=1;$i<=$number;$i++){
11         $arr[$number-$i]=$arr[$number-$i]!=-1?$arr[$number-$i]:jumpFloorII($number-$i); //3、这里的变量i漏掉了$符号
12         $ans+=$arr[$number-$i];
13     }
14     return $arr[$number]=$ans;
15 }

代码二:

 1 //变态跳台阶
 2 private $arr = array();//记忆化递归数组
 3 public function jumpFloorII($number)
 4 {
 5     global $arr;
 6     if($arr[$number]!=-1) return $arr[$number];
 7     $ans=0;
 8     for($i=1;$i<=$number;$i++){
 9         $arr[$number-$i]=$arr[$number-$i]!=-1?$arr[$number-$i]:$this->jumpFloorII($number-$i);
10         $ans+=$arr[$number-$i];
11     }
12     return $arr[$number]=$ans;
13 }
14 public function jumpFloorIIDemo(){
15     global $arr;
16     for($i=0;$i<500;$i++) $arr[$i]=-1;
17     $arr[0]=1;
18     $arr[1]=1;
19     $arr[2]=2;
20     $arr[3]=4;
21     echo($this->jumpFloorII(30));
22     dump($arr);die;
23 }

原文地址:https://www.cnblogs.com/Renyi-Fan/p/9036312.html