斐波那契函數為例:
遞歸 | | 棧 | | :(重復多次調用程序或函數本身)
int fib(int n){ if(n>1) return fib(n-1) + fib(n-2); else return n; // n = 0, 1時給出recursion終止條件 }
遞歸實際上不斷地深層調用函數,直到函數有返回才會逐層的返回,因此,遞歸涉及到運行時的堆棧開銷(參數必須壓入堆棧保存,直到該層函數調用返回為止),所以有可能導致堆棧溢出的錯誤;但是遞歸編程所體現的思想正是人們追求簡潔、將問題交給計算機,以及將大問題分解為相同小問題從而解決大問題的動機。
迭代:(一個程序或函數循環迭代多次)
int fib(int n){ int i, temp0, temp1, temp2; if(n<=1) return n; temp1 = 0; temp2 = 1; for(i = 2; i <= n; i++){ temp0 = temp1 + temp2; temp2 = temp1; temp1 = temp0; } return temp0; }
迭代大部分時候需要人為的對問題進行剖析,將問題轉變為一次次的迭代來逼近答案。迭代不像遞歸一樣對堆棧有一定的要求,另外一旦問題剖析完畢,就可以很容易的通過循環加以實現。迭代的效率高,但卻不太容易理解,當遇到數據結構的設計時,比如圖‘表、二叉樹、網格等問題時,使用就比較困難,而是用遞歸就能省掉人工思考解法的過程,只需要不斷的將問題分解直到返回就可以了。
總結:迭代更為底層一些;遞歸更為高級一些,更抽象一些;所以,有“迭代為人,遞歸為神”的說法。