计算第n项斐波那契数列的值
该部分摘自:《趣学算法》,作者陈小玉老师。
版本1:
#include <iostream>
using namespace std;
fib1(int n){
if(n<0)
return -1;
if(n == 1 || n ==2)
return 1;
return fib1(n-1)+fib1(n-2);
}
int main()
{
cout<<fib1(40)<<endl;
}
算法是正确的,但是呢,时间复杂度特别不好,为指数级。比如,计算出第40项的值只需要三秒时间,但在计算第46项的值时,计算了11秒。
版本2:
fib2(int n){
long i, s1, s2;
if(n<1)
return -1;
if(n == 1 || n ==2)
return 1;
s1 = 1;
s2 = 1;
for(i = 3; i<=n; i++){
s2= s1+s2;//辗转相加
s1= s2-s1;//记录前一项的值
}
return s2;//返回当前项
}
现在,时间复杂度降低到O(n)级别了,计算第46项也仅仅只需要0.4秒。
实例 - 输出指定数量的斐波那契数列
该部分摘自:菜鸟教程,连接:https://www.runoob.com/cprogramming/c-examples-fibonacci-series.html
#include <stdio.h>
int main()
{
int i, n, t1 = 0, t2 = 1, nextTerm;
printf("输出几项: ");
scanf("%d", &n);
printf("斐波那契数列: ");
for (i = 1; i <= n; ++i)
{
printf("%d, ", t1);
nextTerm = t1 + t2;
t1 = t2;
t2 = nextTerm;
}
return 0;
}
实例 - 输出指定数字前的斐波那契数列
#include <stdio.h>
int main()
{
int t1 = 0, t2 = 1, nextTerm = 0, n;
printf("输入一个正数: ");
scanf("%d", &n);
// 显示前两项
printf("斐波那契数列: %d, %d, ", t1, t2);
nextTerm = t1 + t2;
while(nextTerm <= n)
{
printf("%d, ",nextTerm);
t1 = t2;
t2 = nextTerm;
nextTerm = t1 + t2;
}
return 0;
}