遞歸算法雖然不是高性能的算法但是遞歸我們用到的非常的多,如目錄遍歷或樹形結構都會有用到了,下面一起來看小編整理了一些關于遞歸算法的解析與例子。
遞歸函數為自調用函數,在函數體內直接或間接自己調用自己,但需要設置自調用的條件,若滿足條件,則調用函數本身,若不滿足則終止本函數的自調用,然后把目前流程的主控權交回給上一層函數來執行,可能這樣給大家講解,還是很難明白,直接上例子
- function test ($n){
- echo $n.” “;
- if($n>0){
- test($n-1);
- }else{
- echo “<–>”;
- }
- echo $n.” ”
- }
- test(2)
這個例子最終的輸出結果是2 1 0<–>0 1 2
我解釋下 為何輸出是這樣的
第一步,執行test(2),echo 2,然后因為2>0,執行test(1), 后面還有沒來得及執行的echo 2
第二步,執行test(1),echo 1,然后因為1>0,執行test(0),同樣后面還有沒來得及執行的 echo 1
第三步,執行test(0),echo 0,執行test(0),echo 0, 此時0>0的條件不滿足,不在執行test()函數,而是echo “<–>”,并且執行后面的 echo 0
此時函數已經不再調用自己,開始將流程的主控權交回給上一層函數來執行,也就是開始執行剛剛所有test()函數沒來得及輸出的最后一個echo,0的一層是1也就是輸出1 1的上一層是2 也就是輸出2 2沒有山一層 所以呢 輸出的內容就是2 1 0<–>0 1 2
例子,我們要遍歷一個文件夾里面的所有目錄,列出里面所有的文件,PHP本身自帶的有一個readdir的函數,不過只能讀取當前的目錄,根據這個函數,我寫了另外一個函數,用來實現我的需求。函數的原理很簡單,主要就是用了一下遞歸調用.
- function file_list($path){
- if ($handle = opendir($path)) {
- while (false !== ($file = readdir($handle))) {
- if ($file != "." && $file != "..") {
- if (is_dir($path."/".$file)) {
- echo $path.": ".$file."<br>";//去掉此行顯示的是所有的非目錄文件
- file_list($path."/".$file);
- } else { //Vevb.com
- echo $path.": ".$file."<br>";
- }
- }
- }
- }
- }
例子
遞歸的應用中序遍歷二叉樹
- void inorder (BinTree T){
- if (T){
- inorder(T->lchild);
- printf(“%c”,T->data);
- inorder(T->rchild);
- }
- }
新聞熱點
疑難解答