斐波那契数列的第n项求解

斐波那契数列 即为第一,二项为1,其余的项都为其前两项的和 设第n项为 f (n),

则 f (n) = f (n-1)+ f (n-2).

前 10 项:1  1  2  3  5  8  13  21  34  55  

在我目前的认知里有以下几种求解方式:

一:动态规划(还没学过,在书中看到此方法是这个名称)

        首先定义一个整型 pos,输入一个 pos 的值来寻找第 pos 位的 斐波那契项

        定义一个数组 a[N] 来存放斐波那契数列

        此前知道a [1] = a [2] = 1;则在循环中动态去求解第 pos 项

        for (int i = 2;i <= pos-1;i++) {

         a [i] =a [i-1] + a [i-2]; }

        cout << a [pos-1]; 

        可以看出 动态规划 在此题的求解时间复杂度为O(n),是很快的.

二:递归(1)

        第一种递归 底层逻辑是以二叉树的形式 比如a [5] = a [4] + a [3]; a [4]=a [3]+a [2]........

        依次类推 已知a [0]=a [1]=1 在递归的最后进行求和 得到斐波那契项 

        既然是递归 就要定义一个函数        

int fabonacci1 (int n) {

        if ( n < 0) return 0;

        else if ( n < 2) return 1;

        else return fabonacci1 (n-1)+fabonacci1 (n-2);}

        由于是二叉树的形式 且最大可以有2的n次方个结点 因此这个算法的时间复杂度为2的n次方

        为指数型增长 当n的数值变大时 算法的持续时间将会极大地增加 那么有没有更简单的递归算          法呢?

三:递归(2)

        第二种递归 用到三个参数 int first int second int pos

        pos 本身意义为 查找的斐波那契项的位置 在此递归中变为循环条件 用来约束递归     

  int fibonacci2 (int first ,int second ,int pos) {       

        if ( pos < 0) return 0;

        else if ( pos <= 2 ) return 1;

        else if (pos == 3 ) return first + second;

        else return fibonacci2 (second ,first + second ,pos-1); } 

        这里先判断 pos 的值 如果 n<=2 则不需要用到递归 直接通过if_else语句返回数值

        如果 n > 2,则需要进行递归 每递归一次 pos-1,就类似 循环的 pos- -语句,由于pos > 0

        当 pos=3 时 pos 前剩下了pos[1] 和 pos[2],分别对应递归后重新赋值的 first 和 second,

        因此 此时返回 first + second 的数值即可.

        这里运用了 动态规划 和 递归 的思想,pos>=3时 仅需递归 pos-3 次 即可算出结果    

        时间复杂度为O(n) 相比较上一递归方法大大减少了运行时间.

        

        

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值