遞迴轉化成棧的非遞迴的區別

2021-10-08 05:13:27 字數 564 閱讀 6536

遞迴的**量比非遞迴的**量少

因為非遞迴需要額外的變數記錄當前所處的位置資訊,以及額外的控制語句。而遞迴所使用的方式是函式呼叫,這是非常自然的棧結構,遞迴每深入一層,棧的深度也會加一,而且當每一層的遞迴呼叫結束,都會自動返回上一層的遞迴中,不需要記錄位置資訊,不需要新增控制語句,這些工作都由函式呼叫的特性解決了。

遞迴的執行效率比非遞迴的執行效率低.

因為遞迴的實質是函式呼叫,而函式呼叫必然要進行執行緒棧空間的分配,記錄每一次函式呼叫前的狀態等工作,開銷是比較大的。而非遞迴則不需要進行這些工作。

遞迴與非遞迴呼叫最主要區別就是在函式呼叫上

在計算機的工作方式中,函式呼叫是以棧結構來實現的,最早呼叫的函式處於棧底,最晚呼叫的函式處於棧頂,棧中存放的是每個函式中的區域性變數等資訊,當函式呼叫返回時該函式相關的資訊就會從棧中彈出。但正因為函式呼叫要在棧中進行各種操作,例如分配新的空間,儲存當前函式呼叫的資訊,為新的函式呼叫初始化等,效率比較低下。所以遞迴的效率比非遞迴的低。

用棧將遞迴轉化為非遞迴

在競賽中如果系統棧很小的話,過深的遞迴會讓棧溢位,這個時候我們就要自己手寫棧,將遞迴轉化成手工棧。方法其實也很簡單。基本思路上,我們就是用棧不斷的pop,push。但是何時push,何時pop呢?在 演算法導論 上對深度優先遍歷樹的講解中,在深度遍歷中,會對每個節點進行染色,白色為沒有被訪問過 灰色...

遞迴轉手動管理棧的非遞迴

遞迴轉非遞迴 自己管理棧,關鍵在於模擬函式呼叫的過程 棧結構 class lstack def init self,top 1,full 20 self.top top self.stack self.full full def is full self return self.full self....

用棧實現Fibnacci遞迴過程的非遞迴演算法

include include using namespace std 模擬遞迴工作棧。data表示當前狀態的引數值 state表示當前棧的完成狀態,state 2 表示未計算,state 1 表示計算了遞迴樹左部,state 0 表示計算了整個遞迴子樹 struct stacknode stack...