遞歸方法的簡單實例

 

         下面的實例是簡單的實現目錄大小,其中用到了比較常見的遞歸函數

<?php
function dirSize($directory){   //自定義一個函數dirSize(),統計傳入參數的目錄的大小
$dir_size=0;  //初始化
if($dir_handle=opendir($directory)){                   //判斷目錄是否能夠成功打開
  while ($filename=readdir($dir_handle)){               //循環遍歷目錄下的所有文件
   if($filename!="." && $filename !=".."){              //排除兩個特殊的目錄
    $subFile=$directory."/".$filename;                 //將目錄下的子文件和當前目錄相連
    if(is_dir($subFile))                                         //判斷文件名是不是一個目錄
    $dir_size+=dirSize($subFile);                      //遞歸的調用自身函數,求子目錄的大小
    if(is_file($subFile))                                      //判斷文件名是不是一個文件
    $dir_size+=filesize($subFile);                    //求出文件的大小並累加
   }
   
  }
  closedir($dir_handle);                           //逐級關閉文件資源
  return $dir_size;                                 //返回計算後的目錄的大小
}
}
$dir_size=dirSize("phpMyAdmin");          //傳參數,輸入目錄地址
echo round($dir_size/pow(1024,1),2)."KB";    //KB輸出目錄的大小
?>

遞歸函數的實現過程:

假如目錄dir下有dir11.txt2.txt,目錄dir1下有文件3.txt4.txt
dir參數傳入到函數時,函數判斷dir目錄下是否含有目錄,如果有,就進入其目錄下。首先,dir1是個目錄,函數判斷dir1是目錄,並將指針指向下一個文件,下一個文件是1.txt。然後函數就會返回並將dir1參數傳入到函數,函數再判斷dir1下是否有目錄,顯然dir1文件下沒有目錄,只有文件3.txt4.txt。函數開始循環遍歷dir1目錄下所有文件並累加文件的大小。當指針指向4.txt下一個時,因爲沒有,程序不再循環並執行closedir()關閉資源,及關閉了dir1目錄的資源。由於整個dir還沒有運行完,函數執行完dir1下的目錄並關閉資源後開始運行當初指針指向的下一個文件1.txt。然後是2.txt。當指針指向2.txt下一個時,沒有文件,函數循環結束。關閉dir目錄資源。當整個目錄就運行完了,函數及通過累加的方法獲得了所有文件的大小(整個目錄的大小)。這樣就實現了整個遞歸函數的調用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章