#include <iostream>
#include <cassert>
using namespace std;
//时间复杂度O(n)
//空间复杂度O(n)
long long Fib(long long n){//定义为longlong 是因为斐波那契数列很大
assert(n >= 0);//n必须大于0
if(n==0||n==1)
{
return n;
}
//建立一个指针,并为该指针开辟空间
//因为数列开始有个0,所以开辟空间大一个为n+1
long long *p = new long long[n+1];
p[0] = 0;
p[1] = 1;
for(int i = 2;i<=n;i++)
{
//从下表2开始,每个数都等于其前面两个数相加
p[i] = p[i-1]+p[i-2];
}
return p[n];
}//用指针来实现斐波那契数列
//时间复杂度O(n)
//空间复杂度O(1)
long long Fib(long long n)
{
assert(n >= 0);//assert 断言,必须条件
if(n==0||n==1)
{
return n;
}
long long first = 0;
long long second = 1;
long long third = 0;
for(int i = 2;i <= n;i++)
{
third = first + second;
first = second;//将second设置为first
second = third;//将third设置为second
}
return third;
}//利用变量来实现斐波那契数列,变量之间交替相加
//设置 first second third 三个变量
//后一个数为前两个数相加的和,且每得到一个数则抛弃最前面的一个数交替相加
//时间复杂度O(2^n)
//空间复杂度O(n)
long long Fib(long long n)
{
assert(n >= 0);
if(n==0||n==1)
{
return n;
}
else
return Fib(n-1)+Fib(n-2);//递归调用自身
}//递归的达到终止条件,会一层层的退栈返回每一层栈的值,得到最终结果
三种方法实现斐波那契数列
最新推荐文章于 2024-03-29 14:23:34 发布