php基本算法彙總、遞歸運行規則

遞歸函數思想

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

遞推思想

在這裏插入圖片描述

區別:
對比圖例後我們可以發現遞歸和遞推是有所差異的,遞推的整體思想是從小到大,而遞歸的整體思想是從大到小,再從小回到大。簡單說,遞推是更新變量的舊值,遞歸是在函數中調用函數自身。

舉例: 求斐波那契數列的第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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章