「既然遞迴能很好的解決,為什麼還要用迭代呢」?主要的原因還是效率問題……********************檢視資料夾大小********************=遞迴的概念是函式呼叫自身,把乙個複雜的問題分解成與其相似的多個子問題來解決,可以極大的減少**量,使得程式看起來非常優雅。
由於系統要為每次函式呼叫分配執行空間,並使用壓棧予以記錄。在函式呼叫結束後,系統需要釋放空間,並彈棧恢復斷點。所以遞迴的消耗還是比較大的。
即使語言設計時已經將函式呼叫優化的極度完美,達到可以忽略遞迴造成的資源浪費,但是遞迴的深度仍然會受到系統棧容量的限制,否則將會丟擲 stackoverflowerror 錯誤。
而迭代能很好的利用計算機適合做重複操作的特點,並且從理論上說,所有的遞迴函式都可以轉換為迭代函式,所以盡量能不用遞迴就不用遞迴,能用迭代代替就用迭代代替。
迭代的思路是讓計算機對一組指令進行重複執行,在每次執行這組指令時,都從變數的原值推出其它的新值……重複這一過程直到達到結束條件或沒有新值產生。
由於遞迴相當於迴圈加堆疊,所以可以在迭代中使用堆疊來進行遞迴和迭代的轉換。
/** * 資料夾大小
* @param $path
* @return int */
function dirsize($path)
else
/*迭代條件
*/while (count($stack) !== 0)
closedir($handle
); }
return
$size
;}
********************=複製資料夾=********************=
迭代和遞迴都具有初始化變數、判斷結束條件、執行實際操作、產生新變數這四個步驟,只不過所在的位置不同罷了。
比如初始化變數這一步驟,在迭代中是位於函式的開始部分,而在遞迴中是指其他函式傳遞引數這一過程;
判斷結束條件這一步驟,在迭代中用於判斷迴圈是否繼續,在遞迴中用於判斷遞迴的結束位置;
執行實際操作在遞迴和迭代中都是函式的核心部分,位於產生新變數步驟之前;
產生新變數在迭代中是迭代繼續的條件,在遞迴中是下一次遞迴的基礎,由於產生了新變數才使得遞迴或迭代繼續進行。
/** * 複製資料夾
* @param $source
* @param $dest
* @return string */
function copydir($source, $dest
)
/*迭代條件
*/while (count($stack) !== 0)
closedir($handle
); }
return
$target
;}
********************=刪除資料夾=********************=
拋開語言特性影響效能最多的就是冗餘**了,冗餘**通常是由於設計不到位而產生的。
多數情況下遞迴要比迭代冗餘**更多,這也是造成遞迴效率低的一大因素。
但當遞迴**足夠簡練,冗餘度足夠低時,迭代的效能未必就比遞迴高。
比如這個用迭代實現的資料夾刪除函式,速度就比遞迴要慢20%,主要原因是空資料夾的判斷,在遞迴中當資料夾沒有子資料夾時,函式會直接刪除所有檔案和當前資料夾,遞迴結束。
在迭代中即使資料夾為空也需要將其存入堆疊,下次迭代時再判斷是否為空,之後才能刪除。這就相比遞迴多了判斷檔案為空、存入堆疊、取出迭代等冗餘操作,所以處理速度會比遞迴更慢。
/** * 刪除資料夾
* @param $path
* @return bool */
function rmdirs($path
)
/*執行過程
*/foreach ($items
as$item
) }
return !(file_exists($path
));}
********************檢視執行時間********************==
這是乙個檢視**執行時間(毫秒數)的函式,通過**方式執行目標**(或函式),最終計算出執行的時間(毫秒)。通過這個工具可以對比函式之間的效能差距,非常簡單實用的乙個小工具。
/** * 函式執行毫秒數
* @param $func
* @return int */
function exec_time($func
)echo exec_time(function
() );
PHP 資料夾操作 複製 刪除 檢視大小 遞迴實現
php雖然提供了 filesize copy unlink 等檔案操作的函式,但是沒有提供 dirsize copydir rmdirs 等資料夾操作的函式 rmdir也只能刪除空目錄 所以只能手動編寫這些函式,主要的技巧是通過遞迴將問題逐層分解,直到分解成可以直接解決的最小子問題。檢視資料夾大小 ...
php檔案及資料夾操作(建立 刪除 移動 複製)
建立fileutil.php檔案,內容及呼叫方式如下 操縱檔案類 例子 fileutil createdir a 1 2 3 測試建立資料夾 建乙個a 1 2 3資料夾 fileutil createfile b 1 2 3 測試建立檔案 在b 1 2 資料夾下面建乙個3檔案 fileutil cr...
python 遞迴刪除資料夾 遞迴複製資料夾
學過python os模組的人都知道python中的rmdir 函式只能刪除乙個空的資料夾,而remove 函式也只能刪除單個的檔案,沒有乙個現成的方法來刪除乙個資料夾 裡面有檔案 所以我們要借助遞迴去刪除乙個資料夾中的每乙個檔案 或者資料夾 下面是 遞迴刪除資料夾 import os defdel...