遞歸函數思想
遞推思想
區別:
對比圖例後我們可以發現遞歸和遞推是有所差異的,遞推的整體思想是從小到大,而遞歸的整體思想是從大到小,再從小回到大。簡單說,遞推是更新變量的舊值,遞歸是在函數中調用函數自身。
舉例: 求斐波那契數列的第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;