C 將遞迴演算法轉換為非遞迴演算法提高效能

2021-05-25 13:51:25 字數 1547 閱讀 4490

遞迴是指某個函式或過程直接或間接的呼叫自身。一般地乙個遞迴包括遞迴出口和遞迴體兩部分,遞迴出口確定遞迴到何時結束,而遞迴體確定遞迴求解時的遞推關係。遞迴演算法有兩個基本特徵:一是遞迴演算法是一種分而治之的、把複雜問題分解為簡單問題的求解問題方法,對於求解某些複雜問題,遞迴演算法分析問題的方法是有效地;而是遞迴演算法的時間、控制項效率通常比較差。因此對解決某些問題時,我們希望用遞迴演算法分析問題,用非遞迴演算法解決問題,這就需要把遞迴演算法轉換為非遞迴演算法。

把遞迴演算法轉化為非遞迴演算法有如下三種基本方法:

(1).

通過分析,跳過分解過程,直接用迴圈結構的演算法實現求解過程。

(2).

自己用棧模擬系統的執行時棧,通過分析只儲存必須儲存的資訊,從而用非遞迴演算法替代遞迴演算法。

(3).

利用棧儲存引數,由於棧的後進先出特性吻合遞迴演算法的執行過程,因而可以用非遞迴演算法替代遞迴演算法。

在系統中,構造樹形結構(

wbs模板樹、具體專案的

wbs樹、專案群樹、省市縣樹形結構等)時用到了遞迴演算法。就結構簡單的樹形結構而言,對效能的影響並不明顯,例如專案群樹,它的屬於一維的樹形結構,且採用遞迴演算法的遞迴深度小於

3。但是,對於複雜的樹形結構,採用遞迴演算法實現時,響應速度普遍較慢,如

wbs模板樹、具體專案的

wbs樹以及省市縣樹形結構等,都是多維的,且遞迴深度不確定

(至少大於

3)。因此,在構造複雜的樹性結構時需要把遞迴演算法轉換為非遞迴演算法。除此之外,在其它複雜的遞迴演算法中,也可以採用將遞迴演算法轉換為非遞迴演算法的方法,以提高演算法的效能。

在系統中,將遞迴演算法轉換為非遞迴演算法大大提高系統的效能,以省市縣樹形結構的載入為例進行說明,關鍵程式**如下:

// 定義樹形結構資料集合

observablecollection

provicelist = new

observablecollection

();

e_region regiontemp = new

e_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,得 特徵方程如下 練...