斐波那契数列 即为第一,二项为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) 相比较上一递归方法大大减少了运行时间.