递归函数思想
递推思想
区别:
对比图例后我们可以发现递归和递推是有所差异的,递推的整体思想是从小到大,而递归的整体思想是从大到小,再从小回到大。简单说,递推是更新变量的旧值,递归是在函数中调用函数自身。
举例: 求斐波那契数列的第n项的值(递推最经典的问题)
斐波那契数列的规律:1, 1, 2, 3, 5, 8, 13, 21…(最前的两个数都为1,从第3位开始,后面每位数为前两位数的和)
斐波那契数,亦称之为斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列、费波那西数列、费波拿契数、费氏数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……在数学上,斐波那契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*),用文字来说,就是斐波那契数列列由 0 和 1 开始,之后的斐波那契数列系数就由之前的两数相加。
快速推递
递归解法:
使用递归方法。 顺着思路去想, f(1)= 1; f(2) = 1 ; f(3) = f(2)+f(1) 【2】 f(5) = f(3)+f(2)
//使用递归方式求斐波那契数
public function fb($n){ //
if( $n <=2){
return 1;
}else{
return fb($n-1) + fb($n-2);
}
}
运行结果为21 递归方法,每多一层,就要向下递归两次。 约为 O(2 的N次方) 而递推算法为 O(n)
各种算法题目
1. 如下图,有3*4的方格,其中左上角为A点,右下角为B点,现在需要从A点开始,沿着图中黑色的线走到B点,每次只能往右或者往下移动,问共有多少种不同的走法?要求:计算出最终结果或者给出算法描述均可
最佳答案:
function aaaaa($x,$y){
if($x ==0) return 1;
if($y ==0) return 1;
return aaaaa($x-1,$y)+ aaaaa($x,$y-1);
}
var_dump(aaaaa(4,3)); //35
2. n从1开始,每个操作可以选择对n加1,或者对n加倍。如果最后结果为2013,最少需要_____个操作。
最佳答案: 二进制逻辑 计算 如果为奇数,就减一 如果为偶数就减倍
$i = 1;
$sum = 2013;
while (true){
if($sum % 2 ==1){
$sum = ($sum - 1);
}else{
$sum = $sum / 2;
}
if($sum <=1){
break;
}
$i ++;
}
echo $i;
3. 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
本体重点:斐波那契数列
分析:
1月1对a
2月1对a
3月2对,a+a1
4月3对,(a+a1)+a1
5月5对,((a+a1)+a1)+a1+a11
类推得出规律,当月出生的兔子等于前两月出生的兔子的总和。
最佳答案: 推递解法
function aaa($b){
$n = 1; //上上个月
$n1 = 1; //上个月
$c = 0;
for($i=1;$i<=12;$i++){
if($i>=3){
//当前月
$c = $n + $n1;
$n = $n1;// 上上个月 ===
$n1 = $c;//2
if($i==$b){
return $c;
}
}
}
}
var_dump(aaa(8));die;