f(n)=f(n-1)+f(n-2)
直接使用递归计算:
#include<iostream>
using namespace std;
int count=0; //记录fibo函数调用的次数
int fibo(int n){
count++;
if(n==0 || n==1){
return 1;
}else{
return fibo(n-1)+fibo(n-2);
}
}
int main(){
int n=24;
cout<<fibo(n)<<endl;
cout<<"fibo函数被调用了"<<count<<"次"<<endl;
return 0;
}
orisun@zcypc:~$ ./fibo
75025
fibo函数被调用了150049次
150049次!实际上有很多重复计算,比方说你计算f(5)时要去计算f(4)和f(3),而计算f(4)时又要去计算f(3),这样f(3)就重复计算了。
所以有必要发明一种非递归的方法:
#include<iostream>
#include<stack>
using namespace std;
stack<int> st;
int fibo(int n){
if(n==0 || n==1)
return 1;
else{
st.push(1);
st.push(1);
}
for(int i=2;i<=n;i++){
int a=st.top();
st.pop();
int b=st.top();
int c=a+b;
st.push(a);
st.push(c);
}
return st.top();
}
int main(){
int n=24;
cout<<fibo(n)<<endl;
return 0;
}