斐波那契公式:
递归实现:
输入参数n类型:unsigned int
函数体:
if : n == 0 -->返回 0
if : n == 1 -->返回1
if : n >= 2 --> 返回function(n - 1) + function(n - 2)
分析:随着n 的增大,重复计算同一个数的次数明显增多,例如求f(9)会用到f(6);求f(8) 和f(7) 同样会用到f(6);
故随着n的增大 ,递归所用资源急剧上升;
时间复杂度随着n 的增大呈现指数级增长;
循环实现:
当 (n >= 2)时,Fibonacci(2) = Fibonacci(0) + Fibonacci(1);
Fibonacci(3) = Fibonacci(1) + Fibonacci(2);
.....................................................................
Fibonacci(n) = Fibonacci(n-1) + Fibonacci(n-2);
故求f(n)时,只需要知道f(n-1),f(n-2)即可;
时间复杂度O(n);
代码实现:
#include<iostream>
using namespace std;
//----------------------------------------递归实现----------------------------------------------
long long Fibonacci1(unsigned int n)
{
if(n < 2)
return n;
else
return Fibonacci1(n - 1) + Fibonacci1(n - 2);
}
//--------------------------------------循环实现---------------------------------------------------
long long Fibonacci2(unsigned int n)
{
if(n < 2)
return n;
long long FeiOne = 0;
long long FeiTwo = 1;
long long FeiN = 0;
for(unsigned i = 2; i <= n; ++i)
{
FeiN = FeiOne + FeiTwo;
FeiOne = FeiTwo;
FeiTwo = FeiN;
}
return FeiN;
}
int main()
{
unsigned int n;
cout<<"请输入一个正整数:";
cin>>n;
cout<<n<<'\n';
cout<<"斐波那契数列Fei1()为:"<<Fibonacci1(n)<<'\n';
cout<<"斐波那契数列Fei2()为:"<<Fibonacci2(n)<<endl;
return 0;
}
跳台阶问题:
问题描述:一只青蛙一次可以跳上一级台阶,也可以跳上2级台阶;求该青蛙跳上一个n阶的台阶,总共有多少跳法?
分析:n =1-->直接跳上,跳法为1;
n = 2-->先跳台阶1,再跳台阶2;或者直接跳上台阶2;跳法总共有2种;
n > 2时;(1)若青蛙从台阶n-1,直接跳到台阶n;则跳法总数F(n) = F(n - 1)
(2)若青蛙从台阶n-2,直接跳到台阶n;则跳法总数F(n) = F(n - 2)
故:F(n) = F(n - 1) + F( n - 2);
发现其实是斐波那契数列的应用;