我們都知道,程式設計有兩大難點:指標和遞迴。這裡說一說遞迴。
一、什麼是遞迴函式呢?
遞迴函式就是直接或間接的自己呼叫自己的函式。一句話就是:「自己呼叫自己」。
二、什麼時候使用遞迴呢?
當需要不斷重複某一方法時,也就是有某種共同的規律,有如「以此類推」,「重複多次」等情景時。 巧用遞演算法能減少大量**。
三、簡單理解遞迴。
可以這樣簡單的理解遞迴:a讓朋友b**一本書,b沒空,託其朋友c**,c讓逛街的d順路帶來,最後,書到了a手裡。梳理一下,
開始是:a -> b -> c -> d ,到d就停止了,
返回是:d -> c -> b -> a。
遞迴必須要有乙個明確的出口,像這裡d買到書就是出口,如果沒有出口,將陷入無限迴圈。下面舉幾個實際的遞迴例子:
1、斐波那契數列
斐波那契數列
又稱**分割
數列、因
數學家列昂納多·斐波那契(leonardoda fibonacci)以兔子繁殖為例子而引入,故又稱為「
兔子數列
」,指的是這樣乙個數列:1、1、2、3、5、8、13、21、34、......;表示式:f(n) = f(n + 1) + f(n - 1)( f(0)=0,f(1)=1 )
問題:求f(10)的值。
一、非遞迴解法:
functionf($n)
return
$sum;
}
echo f(10);//55
二、遞迴解法:
functionf($n)
return
f($n
-1) +
f($n
-2);
}
echo f(10);//55當$n的值為3時,
f(3) = f(2) + f(1) = 2;
f(4) = f(3) + f(2) = 2 + 1 = 3;
f(10) = f(9) + f(8)
這樣找到出口後,值一層一層的網上傳遞,直到得到結果。
遞迴的兩個關鍵是:出口和迴圈體。
2、無限極分類
一、無限極分類迴圈實現:
$tree= array();
$datas
= array(
array('id'
=>
1,'name'
=>
'褲子','pid'
=>
0),array('id'
=>
2,'name'
=>
'帽子','pid'
=>
0),array('id'
=>
3,'name'
=>
'短褲','pid'
=>
1),array('id'
=>
4,'name'
=>
'長褲','pid'
=>
1),array('id'
=>
5,'name'
=>
'紅帽','pid'
=>
2),array('id'
=>
6,'name'
=>
'禮帽','pid'
=>
2),array('id'
=>
7,'name'
=>
'黑色短褲','pid'
=>
3),array('id'
=>
8,'name'
=>
'白色短褲','pid'
=>
3),);
//將id作為鍵值
foreach($datas
as $data)
foreach($tree
as $k
=>
$v)}
}//刪除多餘節點
foreach($tree
as $k
=>
$v)}
輸出:
array遞迴實現:( [1] => array
([id] => 1
[name] => 褲子
[pid] => 0
[children] => array
([0] => array
([id] => 3
[name] => 短褲
[pid] => 1
[children] => array
([0] => array
([id] => 7
[name] => 黑色短褲
[pid] => 3
)[1] => array
([id] => 8
[name] => 白色短褲
[pid] => 3))
)[1] => array
([id] => 4
[name] => 長褲
[pid] => 1))
)[2] => array
([id] => 2
[name] => 帽子
[pid] => 0
[children] => array
([0] => array
([id] => 5
[name] => 紅帽
[pid] => 2
)[1] => array
([id] => 6
[name] => 禮帽
[pid] => 2))
))
$tree
= $datas
;
functionget_tree($data,$pid)
$tree
= $value;}}
return
$tree;
}print_r(get_tree($tree,0));die;
PHP演算法 遞迴演算法
遞迴函式在日常專案中有很廣泛的用途,例如寫樹結構 遍歷目錄等,今天我們用乙個簡單的遞迴demo來求斐波那契數列,並用 釋它執行的過程。0 1 1 2 3 5 8 13 21 34 function demo n elseif n 1 else return number echo demo 4 輸出...
PHP遞迴演算法
在php開發過程中,遞迴演算法通常用於無限極分類。遞迴演算法的實現方法是有多種的,如通過 靜態變數 全域性變數 引用傳參 的方式。1.靜態變數的方法 靜態變數只存在於函式作用域內,一般的函式內變數在函式結束後會釋放,比如區域性變數,但是靜態變數卻不會。就是說,下次再呼叫這個函式的時候,該變數的值會保...
php遞迴演算法總結
遞迴演算法的實現方法是有多種的,如通過 靜態變數 全域性變數 引用傳參 的方式 靜態變數的方法 function call call 輸出 0 1 2 3 4 5 6 7 8 9 利用static定義靜態變數來實現遞迴排序。如上我們定義了乙個call方法和靜態變數 i,如果我們不給 i變數新增判斷,...