斐波那契數列

//使用迭代的方式
int fun1(int n)
{
    if (n <= 2)
        return 1;

    int a, b, c;
    a = 1;
    b = 1;
    for (int i=3; i<=n; i++)
    {
        c = a + b;
        a = b;
        b = c;
    }

    return c;
}

//使用打表的方式
int f[100];
int fun2(int n)
{
    f[1] = f[2] = 1;

    for (int i=3; i<=n; i++)
        f[i] = f[i-1] + f[i-2];

    return f[n];
}

//使用遞歸  f(n) = f(n-1) + f(n-2)
int fun3(int n)
{
    if (n <= 1)
        return n;

    return fun1(n-1) + fun1(n-2);
}

//fun3()在遞歸調用過程中產生大量冗餘 很多f(n)會計算多次 改進如下
int additiveSequence(int n, int t0, int t1)
{
    if (n == 0)
        return t0;

    if (n == 1)
        return t1;

    return additiveSequence(n-1, t1, t0 + t1);
}

int fun4(int n)
{
    return additiveSequence(n, 0, 1);
}

//將結果緩存,避免重複的遞歸
int f[30];

int fun5(int n)
{
    if (n == 0)
        return f[0] = 0;
    else if (n == 1)
        return f[1] = 1;
    else
    {
        f[n] = fun(n-1) + fun(n-2);
        return f[n];
    }
}

參考:《程序設計抽象思想》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章