1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
/* #编程思想 编程思想:如何利用数学模式,来解决对应的需求问题﹔然后利用代码实现对应的数据模型(逻辑)。 算法:使用代码实现对应的数学模型,从而解决对应的业务问题。 递推算法 递推算法是一种简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法。递推算法分为顺推和逆推两种。 顺推:通过最简单的条件(已知),然后逐步推演结果 逆推:通过结果找到规律,然后推到已知条件 斐波那契数列:1 1 2 3 5 8 13 ...,通常需求:请求得指定位置N所对应的值是多少 找规律: 1、第一个数是1 2、第二个数也是1 3、从第三位开始:属于前两个数的和 代码解决思路: 1、如果数字位置为1和2,结果都是1 2、从第三个开始,想办法得到前两个的结果,就可以得到 终极解决办法:想办法把要求的位置之前的所有的值都列出来,那么要求的数就可以通过前两个之和计算出来:使用数组存储所有结果即可。 */ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
//斐波那契 $f[1] = 1; $f[2] = 1; //取对应位置的结果 $des = 0; for($i=3;$i <= $des;$i++){ $f[$i]= $f[$i-1] + $f[$i-2]; } print_r($f); //为方便重复调用,封装自定义函数 function my_recursive($des){ if($des == 1 || $des == 2) return 1; $f[1] = 1; $f[2] = 1; for($i=3;$i <= $des;$i++){ $f[$i]= $f[$i-1] + $f[$i-2]; } return $f[$des]; } echo my_recursive(50),'<br/>'; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#递归算法 /* 递归算法是把问题转化为规模缩小了的同类问题的子问题,然后递归调用函数(或过程)来表示问题的解。 1、简化问题:找到最优子问题(不能再小) 2、丞数自己调用自己 斐波那契数列:1 1 23 5 8 13... 需求:求指定位置的数列的值 规律:第一个和第二个为1,从第三个开始为前两个之和 F(N)= F(N-1) + F(N-2); F(N-1)= F(N-2)+ F(N - 3); ... F(2) = F(1) = 1; 递归思想中:有两个非常重要的点 递归点:发现当前问题可以有解决当期问题的函数,去解决规模比当前小一点的问题来解决F(N)= F(N - 1)+F(N - 2); 递归出口:当问题解决的时候,已经到达(必须有〉最优子问题,不能再次调用函数 如果一个函数递归调用自己而没有递归出口:就是死循环 递归的本质是函数调用函数:一个函数需要开辟一块内存空间,递归会出现同时调用N多个函数(自己):递归的本质是利用空间换时间 */ |
1 2 3 4 5 6 7 8 9 10 |
function recursion($n){ //递归出口 if($n == 1 || $n == 2) return 1; return recursion($n-1) + recursion($n-2); } echo recursion(15); |