中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言典型題——求菲波那切數列第N項

發布時間:2020-06-29 13:37:40 來源:網絡 閱讀:804 作者:星辰之洛 欄目:編程語言

菲波那切數列*

1.引入
斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:1、1、2、3、5、8、13、21、34、……在數學上,斐波納契數列以如下被以遞推的方法定義:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)在現代物理、準晶體結構、化學等領域,斐波納契數列都有直接的應用,為此,美國數學會從1963年起出版了以《斐波納契數列季刊》為名的一份數學雜志,用于專門刊載這方面的研究成果。

2.定義
斐波那契數列指的是這樣一個數列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368
........這個數列從第3項開始,每一項都等于前兩項之和。
斐波那契數列的定義者,是意大利數學家列昂納多·斐波那契(Leonardo Fibonacci),生于公元1170年,卒于1250年,籍貫是比薩。他被人稱作“比薩的列昂納多”。1202年,他撰寫了《算盤全書》(Liber Abacci)一書。他是第一個研究了印度和阿拉伯數學理論的歐洲人。他的父親被比薩的一家商業團體聘任為外交領事,派駐地點于阿爾及利亞地區,列昂納多因此得以在一個阿拉伯老師的指導下研究數學。他還曾在埃及、敘利亞、希臘、西西里和普羅旺斯等地研究數學。
3.求解

1. 遞歸方法

C語言典型題——求菲波那切數列第N項
根據這個公式,應用遞歸調用可以很好的求解菲波那切數列第N項,以下為求解過程(源代碼):

#include<stdio.h>
#include<stdlib.h>
int fib(int n)
{
    if (n <= 2)
        return  1;
    else 
        return  fib(n - 1) + fib(n - 2);
}
int main()
{
    int n = 0;
    int ret = 0;

    scanf("%d",&n);
    ret = fib(n);
    printf("%d\n", ret);
    system("pause");

    return 0;
}

我們在驗證前幾個菲波那切數列都沒有問題,但是這樣就完了嗎?不,其實再往下走,比如給個50他就算不出來了。這是為什么呢,仔細想想就不難發現:原來每次遞歸調用都會把一個值重復算好多遍,我們用個例子來驗證一下:

#include<stdio.h>
#include<stdlib.h>
int count = 0;
int fib(int n)
{

    if (n == 3)
        count++;
    if (n <= 2)
        return  1;
    else 
        return  fib(n - 1) + fib(n - 2);
}
int main()
{
    int n = 0;
    int ret = 0;

    scanf("%d",&n);
    ret = fib(n);
    printf("%d\n", ret);
    printf("%d\n", count);
    system("pause");

    return 0;
}

這個代碼輸出結果為
C語言典型題——求菲波那切數列第N項
這里我們定義一個全局變量count,這里只僅僅計算了fib(3)被重復計算的次數就已經這么大了,可想而知這個代碼輸入的N值一旦很大計算效率就會變得極其差,那么怎么解決這個問題呢,下面在引進一個方法:

2.非遞歸——迭代(即循環)

我們怎么做呢,就是這樣:前三個菲波那切數我們知道,我們可不可以利用迭代來計算后面的斐波那契數呢,顯然是可以的。我們可以這樣想:首先讓a=1,b=1我們讓c=a+b然后利用循環來交換a,b,c的值不就好了。可是如何實現呢,以下分享一下我的想法:

#include<stdio.h>
#include<stdlib.h>
int fib(int n)
{
    int a = 1;
    int b = 1;
    int c = 0;
    while (n > 2)
    {
        c = a + b;
        a = b;
        b = c;
        n--;
    }
    return c;
}
int main()
{
    int n = 0;
    int ret = 0;

    scanf("%d",&n);
    ret = fib(n);
    printf("%d\n", ret);
    system("pause");

    return 0;
}

這個思想可以這樣實現,可是又出現一個問題,當n太大時數存不下來,從而導致計算可能有點問題,所以還是需要大佬們來完善一下。可是這個的效率絕對比上面的遞歸方法要高很多,這個計算比較小的n還是挺快的。
這里我們看到有些問題可以用遞歸去做,但是不適用遞歸解決它,否則只會適得其反。希望在小伙伴們的評論區里找到更好的解決辦法哦。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

昌江| 耒阳市| 越西县| 横山县| 伊宁县| 咸阳市| 汽车| 娱乐| 昌宁县| 旌德县| 文水县| 府谷县| 弋阳县| 石河子市| 宁津县| 井陉县| 邵阳县| 霸州市| 东方市| 荣成市| 英山县| 兴仁县| 斗六市| 湖州市| 邹城市| 松潘县| 囊谦县| 宝鸡市| 上思县| 淮安市| 六枝特区| 弥渡县| 耿马| 康乐县| 武胜县| 潼南县| 广德县| 阿拉善盟| 平塘县| 滨海县| 贞丰县|