迭代是人,遞迴是神(迭代與遞迴的總結 比較)

2021-09-08 13:45:19 字數 1308 閱讀 5915

在計算機程式設計實現中有常常兩種方法:一曰迭代(iterate);二曰遞迴(recursion)。

從「程式設計之美」的角度看,可以借用一句非常經典的話:「迭代是人,遞迴是神!」來從巨集觀上對二者進行把握。

從概念上講,遞迴就是指程式呼叫自身的程式設計思想,即乙個函式呼叫本身;迭代是利用已知的變數值,根據遞推公式不斷演進得到變數新值得程式設計思想。

從直觀上講,遞迴是將大問題化為相同結構的小問題,從待求解的問題出發,一直分解到已經已知答案的最小問題為止,然後再逐級返回,從而得到大問題的解(乙個非常形象的例子就是分類回歸樹 classification and regression tree,從root出發,先將root分解為另乙個(root,sub-tree),就這樣一直分解,直到遇到leafs後逐層返回);而迭代則是從已知值出發,通過遞推式,不斷更新變數新值,一直到能夠解決要求的問題為止。

以斐波那契數列的求解為例,通過兩種典型的實現進行對比:

fib(0)=0;

fib(1)=1;

fib(n)=fib(n-1)+fib(n-2);

遞迴的實現

[objc]view plain

copy

int fib(int n)  

迭代的實現

[objc]view plain

copy

int fib(int n)  

return temp0;  

}  

下面就對遞迴和迭代進行比較:

遞迴實際上不斷地深層呼叫函式,直到函式有返回才會逐層的返回,因此,遞迴涉及到執行時的堆疊開銷(引數必須壓入堆疊儲存,直到該層函式呼叫返回為止),所以有可能導致堆疊溢位的錯誤;但是遞迴程式設計所體現的思想正是人們追求簡潔、將問題交給計算機,以及將大問題分解為相同小問題從而解決大問題的動機。

迭代大部分時候需要人為的對問題進行剖析,將問題轉變為一次次的迭代來逼近答案。迭代不像遞迴一樣對堆疊有一定的要求,另外一旦問題剖析完畢,就可以很容易的通過迴圈加以實現。迭代的效率高,但卻不太容易理解,當遇到資料結構的設計時,比如圖『表、二叉樹、網格等問題時,使用就比較困難,而是用遞迴就能省掉人工思考解法的過程,只需要不斷的將問題分解直到返回就可以了。

總之,遞迴演算法從思想上更加貼近人們處理問題的思路,而且所處的思想層級算是高層(神),而迭代則更加偏向於底層(人),所以從執行效率上來講,底層(迭代)往往比高層(遞迴)來的高,但高層(遞迴)卻能提供更加抽象的服務,更加的簡潔。

從個人來講,我非常認同「迭代是人,遞迴是神」!

迭代是人,遞迴是神(迭代與遞迴的總結 比較)

在計算機程式設計實現中有常常兩種方法 一曰迭代 iterate 二曰遞迴 recursion 從 程式設計之美 的角度看,可以借用一句非常經典的話 迭代是人,遞迴是神!來從巨集觀上對二者進行把握。從概念上講,遞迴就是指程式呼叫自身的程式設計思想,即乙個函式呼叫本身 迭代是利用已知的變數值,根據遞推公...

迭代是人,遞迴是神(迭代與遞迴的總結 比較)

在計算機程式設計實現中有常常兩種方法 一曰迭代 iterate 二曰遞迴 recursion 從 程式設計之美 的角度看,可以借用一句非常經典的話 迭代是人,遞迴是神!來從巨集觀上對二者進行把握。從概念上講,遞迴就是指程式呼叫自身的程式設計思想,即乙個函式呼叫本身 迭代是利用已知的變數值,根據遞推公...

迭代是人,遞迴是神(迭代與遞迴的總結 比較)

在計算機程式設計實現中有常常兩種方法 一曰迭代 iterate 二曰遞迴 recursion 從 程式設計之美 的角度看,可以借用一句非常經典的話 迭代是人,遞迴是神!來從巨集觀上對二者進行把握。從概念上講,遞迴就是指程式呼叫自身的程式設計思想,即乙個函式呼叫本身 迭代是利用已知的變數值,根據遞推公...