之前我們看過的演算法 bottomupsort 和 mergesort,前者是迭代的,而後者是遞迴的。
在這裡我們可以思考一下,既然能夠利用演算法 bottomupsort,為什麼還要借助於像 mergesort 那樣的遞迴演算法呢?尤其是考慮到因使用棧而需要的額外空間數,以及由處理遞迴呼叫內在開銷帶來的額外空間。
而且從實踐的觀點來看,似乎沒有理由贊成用遞迴演算法替代其等價的迭代演算法。
但是從理論的觀點來看,遞迴演算法具有對問題易於敘述、領會和分析等優點。為了理解這一點,我們可以對演算法 mergesort 和 bottomupsort 的**作比較,很明顯後者需要花更多的時間除錯和理解**的含義。
這啟示我們設計演算法可以從遞迴描述的框架著手,如果可能,以後再將演算法改進並轉化為乙個迭代的演算法。
每個遞迴演算法總是可以被轉換為迭代演算法的,而且兩者在解決問題每個例項時他們的功能是完全相同的。
點這裡檢視 buttomupsort
點這裡檢視 mergesort
最後再用著名的 fibonacci 序列來稍微比較一下遞迴和迭代所耗費的時間。
在數學上,fibonacci 序列是用遞迴來定義的,它的性質如下所示:
f0 = 0f
1 = 1f
2 = 1f
3 = 2f
4 = 3f
5 = 5.
..fn = f
n-1 + f
n-2
我們可以用 遞迴 和 迭代 兩種方法來求解 fibonacci(n) 的值,然後非常直觀地比較這兩種方法所耗費的時間。
以下這兩個方法到了 index=140 的時候,會因為計算結果超過 decimal 型別的最大值而丟擲異常
public static decimal fibonacciiteration(int index)
return sum;}}
}) = ",
i, fibonacci.fibonacci.fibonacciiteration(i));}}
catch (exception ex)
try) = ",
i, fibonacci.fibonacci.fibonaccirecursion(i));}}
catch (exception ex)
console.readkey();}}
}程式執行截圖
執行程式時,可以非常直觀的察覺到用迭代方法來計算,結果都是瞬間計算出來的,
而遞迴算得卻很慢,特別是當 index=33-35 時,幾乎要花掉1秒鐘來計算,而且越到後面需要的時間更是成指數增長
演算法篇之分治演算法 歸併排序
分治演算法 分治 把乙個任務分成形式和原任務相同,但規模更小的幾個部分任務 通常是兩個部分 分別完成,或只需要選一部分完成。然後再處理完成後的這乙個或幾個部分的結果,實現整個任務的完成。例題1 歸併排序 陣列排序任務可以如下完成 a.把前一半排序 b.把後一半排序 c.把兩半歸併到乙個新的有序陣列,...
分治演算法之合併排序
合併排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列 1 分解 將待排序元素分成大小大致相同的兩個子串行 2 治理 對兩個子串行進行合併排序 3 合併 將排好序的有序子串行進行合併,得到最終的有序序列 合...
分治演算法(二)合併排序
1.問題分析 合併排序問題給定的是乙個無序的序列,可以把待排序的元素分解為兩個規模大致相等的子串行。如果還是不容易解決就繼續將子串行分解,直到子串行中的元素個數為1,因為單個元素的序列本身是有序的,此時便可以進行合併,從而得到乙個完整的有序序列。2.演算法設計 1 分解 將待排序元素分成大小大致相同...