對於遞歸,有人提到了兩點:
(1)對棧的容量的壓力。
(2)個別問題的遞歸解法,其算法的低效性。
這兩個因素我簡短點評下,
(1)對棧的容量壓力:
通常遞歸的深度很大造成的。對於這壹點當然應該有程序員編碼時,來衡量和把握。win32 中壹個新建的線程,默認的棧通常在 1 MB 大小。那麽如果妳的遞歸函數,深度很大,顯然程序員應該對這種情況有預估,和對風險的避免。
這就和妳選擇,把內存分配在棧上還是堆上,會考慮到分配的內存大小的因素壹樣。
當然,如果在函數內分配很大的棧上空間,在函數體內定義壹個很大的數組,這樣不需要很深的深度,也會讓棧溢出。這當然也是程序員自己應該控制的。
(2)個別問題的遞歸解法,算法的低效。
這個低效主要在於這個問題的算法本身。而不是在遞歸這種方法上。比如說求斐波那契的某壹項,子問題會大量重復出現,會產生很多重復計算,這個是很多算法書上,是用來引導出動態規劃或者查表法的。
這主要是算法本身的效率問題,而不是遞歸的問題。這壹點是必須應該明確的。
(3)我們可以看到,在和樹有關的算法中,經常會有遞歸函數。
例如,遍歷文件夾,刪除註冊表的某壹個 key (及其所有子key)。
尤其對壹般樹的前序,後序遍歷,二叉樹的中序遍歷。
這主要原因是因為樹的定義,就是“遞歸性”的:
樹就是,某壹個節點有多個子節點,每個子節點是壹個樹。
我們再此可以看到,遞歸的顯著優點,是對解的描述的直觀性,代碼的簡潔性。