斐波那契算法模板
介绍
斐波那契问题来源于兔子繁殖问题。
兔子繁殖问题:假设小兔子长大需要一年的时间,成年的兔子每年可以生一只小兔子。
问:如果第一年有一只小兔子,那么 n 年后一共有多少只兔子。
{1,1,2,3,5,8,13…}
根据题目就可以找到规律:从第三年开始,往后每年的兔子数 = 去年兔子数 + 前年兔子数
即 f(n) = f(n-1) + f(n-2)
三种解法
第一种:经典求法(递归法):时间复杂度最高:O(2^n)
算法很简单,只需要不断的使用递归(从高到低)就行,但是时间复杂度非常高,不推荐使用。
//每趟返回第 n 年的兔子数
int f1(int n)
{
if(n <= 0) return 0;
if(n == 1 || n == 2) return 1;
return f1(n-1) + f1(n-2);
}
第二种:顺序求法(遍历法):时间复杂度中等:O(n)
主要是通过遍历迭代求出第 n 年的值(从低到高)。我个人觉得最好使用这种方法
int f2(int n)
{
if(n <= 0) return 0;
if(n == 1 || n == 2) return 1;
int left = 1;
int right = 1;
int temp = 0;
for(int i = 3; i <= n; i++)
{
temp = right;
righe = right + left; //累加
left = temp;
}
return right;
}
第三种:状态矩阵相乘求法:时间复杂度最好:O(logn)
呃呃呃。。。我个人觉得虽然时间复杂度最好,但是代码量有点多,不值得在竞赛中使用。所以就没有研究。可以参考这篇