遞迴 非遞迴

2021-05-27 19:43:14 字數 1058 閱讀 5181

遞迴演算法實際上是一種分而治之的方法,它把複雜問題分解為簡單問題來求解。對於某些複雜問題(例如 

hanio塔問題),遞迴演算法是一種自然且合乎邏輯的解決問題的方式,但是遞迴演算法的執行效率通常比較差。因此 

,在求解某些問題時,常採用遞迴演算法來分析問題,用非遞迴演算法來求解問題;另外,有些程式語言不支援 

遞迴,這就需要把遞迴演算法轉換為非遞迴演算法。

遞迴演算法轉換為非遞迴演算法 有兩種方法

1 直接轉換法   用一些變數儲存中間結果.

消除一些尾遞迴 和單向遞迴.用迴圈結構代替遞迴

尾遞迴是指在遞迴演算法中,遞迴呼叫語句只有乙個,而且是處在演算法的最後

long fact(int n) 

遞迴呼叫返回時,是返回到上一層遞迴呼叫的下一條語句,而這個返回位置正好是演算法的結束處,所以 

,不必利用棧來儲存返回資訊。對於尾遞迴形式的遞迴演算法,可以利用迴圈結構來替代。例如求階乘的遞迴演算法 

可以寫成如下迴圈結構的非遞迴演算法: 

long fact(int n) 

單向遞迴是指遞迴演算法中雖然有多處遞迴呼叫語句  但各遞迴呼叫語句的引數之間沒有關係   ,並且這些遞迴 

呼叫語句都處在遞迴演算法的最後  顯然,尾遞迴是單向遞迴的特例

int f(int n)  

對於單向遞迴,可以設定一些變數儲存中間結構,將遞迴結構用迴圈結構來替代。例如求斐波那契數列的算 

法中用s1和s2儲存中間的計算結果,非遞迴函式如下: 

int f(int n) 

return s; 

}

2  間接轉換法.  棧儲存中間結果.

該方法使用棧儲存中間結果,一般需根據遞迴函式在執行過程中棧的變化得到。其一般過程如下: 

將初始狀態s0進棧 

while (棧不為空)  } 

間接轉換法在資料結構中有較多例項,如二叉樹遍歷演算法的非遞迴實現、圖的深度優先遍歷演算法的非遞迴實 

遞迴轉非遞迴

題目描述 給定乙個列表,該列表中的每個要素要麼是個列表,要麼是整數。將其變成乙個只包含整數的簡單列表。如果給定的列表中的要素本身也是乙個列表,那麼它也可以包含列表。您在真實的面試中是否遇到過這個題?樣例給定 1,2,1,2 返回 1,2,1,2 給定 4,3,2,1 返回 4,3,2,1 挑戰請用非...

遞迴和非遞迴

1 遞迴就是函式呼叫函式本身,執行起來就是函式巢狀函式,層層巢狀,所以函式呼叫 引數堆疊都是不小的開銷,但是程式簡單。2 非遞迴就是不斷地對引數入棧 出棧,省去了函式層層展開 層層呼叫的開銷。雖然引數出入棧次數多了,但是一般都開闢固定的足夠大的記憶體來一次性開闢 重複使用。3 非遞迴是從堆疊的角度來...

遞迴 遞迴演算法的非遞迴優化

一 遞迴 在方法內部呼叫自身方法的過程稱為遞迴,下面給出乙個遞迴方法的示例。class program 使用遞迴,實現求前n項和 public static int getsum int n int result getsum n 1 在方法體中呼叫方法本身 return result n 需要注意...