C语言斐波那契数列部分问题程序求解过程,两种思想

1 篇文章 0 订阅

fibonacci numbers简单介绍

在这里插入图片描述

其最早起源于著名的兔子问题,由斐波那契研究,不断发展。有趣的是与黄金分割的关系,这样一个完全是自然数的数列,通项公式却是用无理数来表达的。而且当趋向于无穷大时,前一项与后一项的比值越来越逼近黄金分割0.618(或者说后一项与前一项的比值小数部分越来越逼近 0.618)
斐波那契数列由 0 和 1 开始,之后的斐波那契数列系数就由之前的两数相加,在数学上,斐波那契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*)eg: 0、1、1、2、3、5、8、13、21、34

以下为n从0到45,可用作测试程序以及两种算法时间复杂度对比参考:

0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986 102334155 165580141 267914296 433494437 701408733 1134903170

详解代码所示

主要使用C++以及C语言等代码


#include <iostream>

long Solution_1(int N);//采用递归思想,从所求项向最初项前进,得到该值后,即刻返回层层返回但不太方便的出整个数列,且时间复杂度过大,T(n)=O(2^n)
long Solution_2(int n,long *arr);//采用常规思想,由最初项向所求项发展,逐步前进。易得整个数列,并且时间复杂度较小,T(n) = O(n)

int main(int argc, const char** argv) {

    int n;
    int i;
    long getN;
    long *p;
    printf("please input a number:\n");
    scanf("%d", &n);
    // getN = Solution_1(n);
    getN = Solution_2(n, p);
    printf("When n = %d ,The fibonacci number you want :%d \n", n, getN);
    printf("The datailed fibonacci numbers :\n");
    for (i = 0 ; i < n+1;i++){
        printf("%d ", *(p+i));
    }
    
    return 0;
}

long Solution_1(int n){
    if(n==0)
    {
       // printf("%d",0);
       return 0;
    }
    if(n==1){
        return 1;
    }
    return Solution_1(n-1)+Solution_1(n-2);

}

long Solution_2(int n,long *arr){

    int i = 0;
    
    arr[0] = 0;
    arr[1] = 1;

    for (i = 2; i <= n ; i++)
    {
        arr[i] = arr[i-1] + arr[i-2];
    }
    return arr[n];

}

以上两函数代表两种算法,具体详解请看图中代码注释。
以上均为个人见解,多有不周之处,敬请见谅

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

taco_HUA_James

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值