昨天和宿舍一哥們討論二叉樹中求最近公共父節點問題時,才發現原來對遞迴的理解都是錯的,其實在程式內部分配的棧和資料結構的棧功能基本一樣,當然前者的棧還涉及到棧幀,函式內部訪問某個棧幀的元素並不一定是從棧頂訪問。
舉乙個簡單的例子,遍歷乙個二叉樹,無論是非遞迴演算法和遞迴演算法時間複雜度都是o(n),以前認為遞迴演算法不是o(n),汗乙個,其實遞迴演算法的時間複雜度並不一定高,說它低效的原因僅僅是函式呼叫自身需要對對棧幀的入站和出棧,這是計算機內部實現遞迴時的低效,如果拋開這個,效率還是很高的。
待學習:看《計算機構造與解釋》 遞迴的複雜度計算方法,還有遞迴的棧幀結構。
以下內容:**:
1。計算遞迴演算法的複雜度只要建立遞迴方程求解就可以了,具體方法有很多,最常用的是一種稱為「主定理(master theorem)」的套用公式法。
你可以參考
2。遞迴演算法如果用堆疊改寫,其複雜度幾乎沒有改變;
3。不是所有的遞迴演算法都可以改寫成相應的迭代演算法的(用了堆疊就不是迭代了,所謂迭代演算法應該是指空間複雜度為o(1),即常數的演算法);
4。尾遞迴是最容易改寫成迭代的一類遞迴,但是還有很多其他的遞迴也可以改寫成迭代。你可以參考程式等價變換的相關資料。
對遞迴模型的理解
一.遞迴模型 分而治之的思想也就是典型的遞迴思想,遞迴思想的核心就是 遞迴模型 的建立,遞迴模型 就是處理這類問題的乙個 相同的框架,這個框架不僅僅是處理總問題的框架,也是處理組成總問題的子問題的框架,這個框架具有公用性,要適用這種公用性,就可以推斷得出,這類問題的結構就有遞迴性質 從前有座上,山上...
對尾遞迴的理解
遞迴,在程式執行過程中呼叫自己,每一級遞迴都需要呼叫函式,會建立新的棧空間,隨著遞迴深度的增加,建立的棧越來越多,造成棧的 尾遞迴基於函式的尾呼叫,每一級呼叫直接返回函式的返回值更新呼叫棧,而不是建立新的呼叫棧,類似迭代的實現,時間和空間上均優化了一般的遞迴 存在的問題,python不支援尾遞迴,遞...
對遞迴的簡單理解
今天一小夥伴寫了乙個遞迴,echo可以輸出要取的值,return的卻總是null,寫了乙個簡單的測試復原一下問題。function test i echo i return i a test 30 var dump a 結果如下 261014182226 int 26 思路看上去很簡單,i 3就遞迴...