F(0)=0
F(1)=1
F(n) = F(n-1)+ F(n-2) (n≧2)
递归写法
#include<iostream>
#include<cstdio>
using namespace std;
int fib(int n)
{
if(n==0)
return 0;
else if(n==1)
return 1;
else
return fib(n-1)+fib(n-2);
}
int main()
{
int n;
while(cin>>n){
cout<<fib(n)<<endl;
}
return 0;
}
因为此递归会多次重复的计算所以时间复杂度很高。
不难发现,每次下一项总会和前一项有联系,所以我们可以用动态规划的思想。
动态规划版
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int n,g,f;
while(cin>>n){
g=0;
f=1;
if(n==0){
cout<<"0"<<endl;
continue;
}
while(0<--n){
f+=g;
g=f-g;
}
cout<<f<<endl;
}
return 0;
}
类似oj题目 HRBUST - 1266 https://vjudge.net/problem/HRBUST-1266
AC代码
#include<iostream>
#include<cstdio>
using namespace std;
typedef unsigned long long ull;
int main()
{
ull n,g,f;
while(cin>>g>>f>>n){
for(int i=3;i<=n;i++){
f+=g;
g=f-g;
}
if(n==1) f=0;
cout<<f<<endl;
}
return 0;
}
用三个参数
#include<iostream>
#include<cstdio>
using namespace std;
typedef unsigned long long ull;
int main()
{
ull n,m,k,f1,f2,f3;
while(cin>>n>>m>>k){
f1=n,f2=m,f3;
for(int i=3;i<=k;i++)
{
f3=f1+f2;
f1=f2;
f2=f3;
}
if(k==1)
f3=n;
else if(k==2)
f3=m;
cout<<f3<<endl;
}
return 0;
}