階乘的求解思路:
5! = 5 * 4!
5! = 5 * 4 * 3!
5! = 5 * 4 * 3 * 2!
5! = 5 * 4 * 3 * 2 * 1!
1! =1;
計算5的階乘時,沒有當即計算出結果,須要求更低的階乘php
求5 的階乘,核心:求其餘數的階乘。
定義一個求階乘的函數fn: fn(5) = 5 * fn(4)
剩下的階乘: fn($n )
在函數fn()中調用自己。ide
1)介紹
將大問題拆分紅多個小問題來解決。
小問題的解決方法與大問題的解決方法一致。
能夠封裝函數來解決大問題(求階乘的函數fn)
小問題的解決能夠經過調用該函數來fn實現,只是輸入的參數不一致而已。函數
2)本質
因爲小問題的解決方法與大問題的解決方法一致,函數內部去調用函數自己。
3)遞歸兩要素
遞歸的調用點(入口):什麼狀況下函數開始調用自己。f(5) = 5 * f(4)
遞歸的出口。何時結束遞歸調用的問題。對於階乘來講:計算1的階乘,
4)應用:階乘 code
5)遞歸的執行原理
調用一次函數,不會理解獲得結果。須要按照新參數執行函數。不斷的調用新的函數,直到拿到肯定的值,再返回,逐層拿到計算結果。執行時佔用的空間比較大。blog
百數之和:
在1+ 2 + 3+ 4…
將上一次運算的結果做爲條件,計算下一個的結果
7)介紹
又稱遞推:
將已知條件做爲迭代的原始值,不斷有原始值計算出新值的過程。執行效率很是高。
Fibanacci數列 :
一對兔子生小兔子的問題:
1 1 2 3 5 8 13 21 34
斐波那契額數列:有以下一個數列:1, 2, 3, 5, 8, 13, 21,……. 其規則是:前兩個已知(即1和2),從第3個開始,其值爲其左邊兩個值的和(此數列稱爲斐波那契數列)。定義一個函數,該函數能夠求出該數列的任意第n個數的值。遞歸
function Fei( $n ){ if ( $n==1 ) { //特例值 return 1; } else if ( $n==2 ) { //特例值 return 2; } else { return Fei($n-1) + Fei($n-2); //遞歸調用 } }
3.遞歸與遞推的差別
遞歸在運行過程當中不斷開闢程序運行的內存空間,佔用空間比較大。執行效率比較低。
可是在某些狀況,如讀取文件夾,因爲不知道文件夾有多少層,此時只能使用遞歸思想。圖片