斐波那契列數列的遞歸與迭代

談到斐波那契數列數組

  • 常想到的是遞歸,因爲在電腦中存儲數據是開闢棧來存儲,如果所要計算的值太大,要面對兩個問題,一個是時間問題:對一數的計算,遞歸和回溯過程當中會重複對一個值(例如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問題,青蛙跳臺階問題)此時用遞歸思想能夠將問題簡潔明瞭的解決,這樣就補償了他所帶來的運行時開銷。遞歸

相關文章
相關標籤/搜索