方法一:循环法
int fb_fun01(int n)
{
int first = 1;
int second = 1;
int ret = 0;
for (int i = 3; i <= n; i++)
{
ret = first + second;
first = second;
second = ret;
}
return second;
}
时间复杂度:O(n)
空间复杂度:O(1)
方法二:递归法
int fb_fun01(int n)
{
if (n == 1 || n == 2)
{
return 1;
}
else
{
return fb_fun01(n - 1) + fb_fun01(n - 2);
}
}
时间复杂度:因为成二叉树形式 ,所以时间复杂度为O(2n)
空间复杂度:树约有n-1层,所以空间复杂度为O(n)
方法三:公式法
int fib(int n)
{
double sqrt_5 = sqrt(5);
double fib_n = pow((1 + sqrt_5) / 2, n) - pow((1 - sqrt_5) / 2, n);
return round(fib_n / sqrt_5); /*round()函数四舍五入*/
}
方法四:动态规划法
1. 确定 dp数组以及下标的含义:dp[i] 的定义为:第 i 个数的斐波那契数值是 dp[i]
2. 确定递推公式:状态转移⽅程 dp[i] = dp[i - 1] + dp[i - 2]
3. 初始化dp数组: dp[0] = 0, dp[1] = 1
4. 确定遍历顺序: dp[i] 是依赖 dp[i - 1] 和 dp[i - 2] ,所以遍历的顺序是从前到后遍历
int fib(int n)
{
if(n<2) return n;
int dp[n+1];
dp[0]=0;
dp[1]=1;
for(int i=2;i<=n;++i)
{
dp[i]=dp[i-1]+dp[i-2];
}
return dp[n];
}
时间复杂度:O(n)
空间复杂度:O(n)
方法一总代码:
#include <iostream>
using namespace std;
//循环实现斐波那契数列
int fb_fun01(int n)
{
int first = 1;
int second = 1;
int ret = 0;
for (int i = 3; i <= n; i++)
{
ret = first + second;
first = second;
second = ret;
}
return second;
}
int main()
{
int k;
cin>>k;
int *p=new int[k];
for (int i = 1; i <=k; i++)
{
*p=fb_fun01(i);
cout<<*p<<" ";
}
delete[]p;
return 0;
}
#include <iostream>
using namespace std;
//循环实现斐波那契数列
int fb_fun01(int n)
{
int first = 1;
int second = 1;
int ret = 0;
for (int i = 3; i <= n; i++)
{
ret = first + second;
first = second;
second = ret;
}
return second;
}
int main()
{
int k;
cin >> k;
for (int i = 1; i <= k; i++)
{
cout << fb_fun01(i) << " ";
}
return 0;
}
方法二总代码:
#include <iostream>
using namespace std;
int fb_fun01(int n)
{
if (n == 1 || n == 2)
{
return 1;
}
else
{
return fb_fun01(n - 1) + fb_fun01(n - 2);
}
}
int main()
{
int k;
cin >> k;
for (int i = 1; i <= k; i++)
{
cout << fb_fun01(i) << " ";
}
return 0;
}