對尾遞迴的理解

2021-08-21 15:46:52 字數 501 閱讀 1050

遞迴,在程式執行過程中呼叫自己,每一級遞迴都需要呼叫函式,會建立新的棧空間,隨著遞迴深度的增加,建立的棧越來越多,造成棧的**

尾遞迴基於函式的尾呼叫,每一級呼叫直接返回函式的返回值更新呼叫棧,而不是建立新的呼叫棧,類似迭代的實現,時間和空間上均優化了一般的遞迴

存在的問題,python不支援尾遞迴,遞迴深度超過1000時會報錯

有人對python的尾遞迴寫了乙個優化版,讓python突破遞迴呼叫1000次的限制

實現乙個 tail_call_optimized 裝飾器,通過裝飾器來在每次遞迴呼叫函式前,丟擲了乙個異常,然後將這次呼叫的引數寫進異常物件,再再蹦床函式裡捕獲這個異常,並將引數讀出來,然後進行迭代呼叫。

在遞迴函式呼叫時,先插入乙個 trampolining(蹦床) 函式。在用這個蹦床函式來呼叫真正的遞迴函式,並且修改遞迴函式的函式體,不讓它再次進行遞迴的函式呼叫,而是直接返回下次遞迴呼叫的引數,由蹦床函式來進行下一次遞迴呼叫。這樣一層一層的遞迴呼叫就會變成由蹦床函式一次一次的迭代式函式呼叫。

對遞迴的理解

昨天和宿舍一哥們討論二叉樹中求最近公共父節點問題時,才發現原來對遞迴的理解都是錯的,其實在程式內部分配的棧和資料結構的棧功能基本一樣,當然前者的棧還涉及到棧幀,函式內部訪問某個棧幀的元素並不一定是從棧頂訪問。舉乙個簡單的例子,遍歷乙個二叉樹,無論是非遞迴演算法和遞迴演算法時間複雜度都是o n 以前認...

個人理解 尾呼叫與遞迴

尾呼叫就是指某個函式的最後一步是呼叫另乙個函式。尾遞迴就是尾呼叫自身。相信大家都看過阮老師的這篇文章 尾呼叫優化 他是說,函式呼叫會在記憶體形成乙個 呼叫記錄 又稱 呼叫幀 call frame 儲存呼叫位置和內部變數等資訊。如果在函式a的內部呼叫函式b,那麼在a的呼叫記錄上方,還會形成乙個b的呼叫...

遞迴 尾遞迴

階乘函式 n n n 1 n 2 3 2 1 針對這樣的表述,直譯成乙個過程 define factorial n if n 1 1 n factorial n 1 如果是factorial 6 其計算行為是 factorial 6 6 factorial 5 6 5 factorial 4 6 5...