談到斐波那契數列數組
常想到的是遞歸,因爲在電腦中存儲數據是開闢棧來存儲,如果所要計算的值太大,要面對兩個問題,一個是時間問題:對一數的計算,遞歸和回溯過程當中會重複對一個值(例如f(3))進行開闢空間釋放空間,於是會十分耗時;另外一個問題是空間問題:因爲系統分給程序的棧空間是有限的,當數字太大,最終產生的棧空間的狀況,即棧溢出,致使咱們沒法計算。ide
第二個想到的是經過數組來存儲,即將每個計算後的值都存到數組裏,雖然解決了在時間上的問題,但也會出現棧溢出,沒法計算大的斐波那契數。操作系統
爲了解決大數問題同時提升時間上的效率咱們採用迭代的方法(實際上經過循環來實現)。
下面爲其代碼描述:code
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> int main() { int number; int first, second, third; scanf("%d", &number); first = 1; second = 1; if (number < 3) third = 1; while (number >= 3) { third = first + second; first = second; second = third; number--; } printf("%d\n", third); system("pause"); return 0; }
在Linux操做系統下可看出二者計算同一個f(n)迭代所須要的時間比遞歸所須要的時間要少的多多多。。並且所求的數多大均可以,由於沒有限制,只是進行加法和賦值運算,也沒有須要不少的空間。
經過該例子,可發現迭代的實現每每比遞歸實現效率高,但並非遞歸就沒有自身的優勢。
遞歸至關於其餘方法,他的可讀性很高,另外當一個問題很複雜時,使用迭代或其餘方法會很難實現(例如Hanoi問題,青蛙跳臺階問題)此時用遞歸思想能夠將問題簡潔明瞭的解決,這樣就補償了他所帶來的運行時開銷。遞歸