遞迴是指某個函式或過程直接或間接的呼叫自身。一般地乙個遞迴包括遞迴出口和遞迴體兩部分,遞迴出口確定遞迴到何時結束,而遞迴體確定遞迴求解時的遞推關係。遞迴演算法有兩個基本特徵:一是遞迴演算法是一種分而治之的、把複雜問題分解為簡單問題的求解問題方法,對於求解某些複雜問題,遞迴演算法分析問題的方法是有效地;而是遞迴演算法的時間、控制項效率通常比較差。因此對解決某些問題時,我們希望用遞迴演算法分析問題,用非遞迴演算法解決問題,這就需要把遞迴演算法轉換為非遞迴演算法。
把遞迴演算法轉化為非遞迴演算法有如下三種基本方法:
(1).
通過分析,跳過分解過程,直接用迴圈結構的演算法實現求解過程。
(2).
自己用棧模擬系統的執行時棧,通過分析只儲存必須儲存的資訊,從而用非遞迴演算法替代遞迴演算法。
(3).
利用棧儲存引數,由於棧的後進先出特性吻合遞迴演算法的執行過程,因而可以用非遞迴演算法替代遞迴演算法。
在系統中,構造樹形結構(
wbs模板樹、具體專案的
wbs樹、專案群樹、省市縣樹形結構等)時用到了遞迴演算法。就結構簡單的樹形結構而言,對效能的影響並不明顯,例如專案群樹,它的屬於一維的樹形結構,且採用遞迴演算法的遞迴深度小於
3。但是,對於複雜的樹形結構,採用遞迴演算法實現時,響應速度普遍較慢,如
wbs模板樹、具體專案的
wbs樹以及省市縣樹形結構等,都是多維的,且遞迴深度不確定
(至少大於
3)。因此,在構造複雜的樹性結構時需要把遞迴演算法轉換為非遞迴演算法。除此之外,在其它複雜的遞迴演算法中,也可以採用將遞迴演算法轉換為非遞迴演算法的方法,以提高演算法的效能。
在系統中,將遞迴演算法轉換為非遞迴演算法大大提高系統的效能,以省市縣樹形結構的載入為例進行說明,關鍵程式**如下:
// 定義樹形結構資料集合
observablecollectionprovicelist = new
observablecollection
();
e_region regiontemp = newe_region(); //
for (int i = 0; i < dt.rows.count; i++)
//////遞迴載入資料
//////
當前物件
///父級物件
///provicelist ">
樹形資料集合
private
void findregion(e_region temp, e_region parent,observablecollection
provicelist )
else
if (temp.regionfather != parent.regionfather)
else
}else
if (parent.regionfather == parent.regionfather)
}
採用非遞迴演算法構造省市縣樹形結構,提高了效率,從以往的20秒多提高到現在的5秒。
遞迴演算法向非遞迴演算法轉換
遞迴演算法向非遞迴演算法轉換 遞迴演算法實際上是一種分而治之的方法,它把複雜問題分解為簡單問題來求解。對於某些複雜問題 例如hanio塔問題 遞迴演算法是一種自然且合乎邏輯的解決問題的方式,但是遞迴演算法的執行效率通常比較差。因此,在求解某些問題時,常採用遞迴演算法來分析問題,用非遞迴演算法來求解問...
遞迴演算法向非遞迴演算法轉換
遞迴演算法向非遞迴演算法轉換 遞迴演算法實際上是一種分而治之的方法,它把複雜問題分解為簡單問題來求解。對於某些複雜問題 例如hanio塔問題 遞迴演算法是一種自然且合乎邏輯的解決問題的方式,但是遞迴演算法的執行效率通常比較差。因此,在求解某些問題時,常採用遞迴演算法來分析問題,用非遞迴演算法來求解問...
(演算法專題)使用常微分方程將遞迴轉換為非遞迴
用遞推方法解遞迴方程,也就是我們常用的數學歸納法,用生成函式解遞迴方程,也就是我們使用迴圈代替遞迴。這節,我們利用高等數學的常微分方程,來進行求解遞迴式。k階常係數線性齊次遞迴方程形如 其中,bi為常數,第2項為方程初始條件。在上式中,用xn取代f n 有 兩邊分別處以xn k,得 特徵方程如下 練...