遞迴函式被呼叫時,系統需要乙個執行棧。系統的執行棧要儲存函式的返回位址,儲存呼叫函式的區域性變數,每一層遞迴呼叫所需儲存的資訊構成執行棧的乙個工作記錄,在沒進入下一層遞迴呼叫是,系統就會建立乙個新的工作記錄,並把這個工作記錄進棧成為執行棧新的棧頂,每返回一層遞迴呼叫,就退棧乙個工作記錄,因棧頂的工作記錄必定是當前正在執行的遞迴函式的工作記錄,所以棧頂的工作記錄也稱為活動記錄。
對於此系統對於遞迴的處理,我們可以把它交個函式,這就可以實現規範化的遞迴轉換成非遞迴
example:
非遞迴求階乘
//利用非遞迴求階乘#includeusing namespace std;
//結點
struct node
;//鍊錶棧
class linkstack
~linkstack()
void push(int item);
int pop();
bool isempty()const;
private:
node *top;
};void linkstack::push(int item)
int linkstack::pop()
bool linkstack::isempty()const
int main()
else
result*=s->pop();
} cout
}
3 4 4 利用棧將遞迴轉換成非遞迴的方法
在函式執行時系統需要設立乙個 遞迴工作棧 儲存第一層遞迴所需的資訊,此工作棧是遞迴函式執行的輔助空間,所以可以看出,遞迴程式在執行時需要系統提供隱式棧這種資料結構來實現,對於一般的遞迴過程,仿照遞迴演算法執行過程中遞迴工作棧的狀態變化可直接寫出相應的非遞迴演算法。這種利用棧消除遞迴過程的步驟如下。1...
關於遞迴轉換成迴圈的思想
今天在看python的課程時 聽到老師講到了遞迴 實際上 在我大學學程式設計課的時候 就聽到老師們說過 遞迴不是一種很好定義函式邏輯的方式 這是因為在遞迴過程中 程式為了儲存函式現場的變數需要使用大量的記憶體資源 尤其是當遞迴的層數變多時 就會占用大量的記憶體 於是 使用迴圈方式來解決遞迴問題是一種...
多為陣列轉換成一維 遞迴
靜態變數是只存在於函式作用域中的變數,注釋 執行後這種變數不會丟失 下次呼叫這個函式時,變數仍會記著原來的值 function array multi2single array else result array value return result array array array 1 arr...