9.求斐波那契Fibonacci数列通项
(1)递归实现:
#include<iostream> using namespace std; int Fibonacci(int); int main() { int n; cout<<"please input an number n: "<<endl; cin>>n; for(int i=1;i<=n;i++) { cout<<Fibonacci(i)<<endl; } return 0; } int Fibonacci(int n)//运用递归求斐波那契数列 { if(n<3) { return 1; }else { return Fibonacci(n-1)+Fibonacci(n-2); } }
(2)数组实现:明显感觉数组效率要高很多
#include<iostream> using namespace std; int Fibonacci(int); int main() { int n; cout<<"please input an number: "<<endl; cin>>n; cout<<Fibonacci(n); return 0; } int Fibonacci(int n) { if(n<1) { return -1; } if(n<3) { return 1; } int *a=new int[n];//开辟一块内存空间 a[0]=a[1]=1; for(int i=2;i<n;i++) { a[i]=a[i-1]+a[i-2]; } for(int j=0;j<n;j++)//输出所求数组 { cout<<a[j]<<endl; } }
(3)运用向量:
#include<iostream> #include<vector>//使用向量须声明 using namespace std; int Fibonacci(int); int main() { int n; cout<<"please input an number: "<<endl; cin>>n; cout<<Fibonacci(n)<<endl; return 0; } int Fibonacci(int index) //借用vector<int>实现 { if(index<1) { return -1; } vector<int> a(2,1); //创建一个含有2个元素都为1的向量 a.reserve(3);//reserve(size)为当前vector预留至少共容纳size个元素的空间 for(int i=2;i<index;i++) { a.insert(a.begin(),a.at(0)+a.at(1)); a.pop_back();//pop_back()函数删除当前vector最末的一个元素 } return a.at(0);//at() 函数 返回当前Vector指定位置loc的元素的引用 }
(4)使用队列:
#include<iostream> #include<queue>//使用队列须声明 using namespace std; int Fibonacci(int); int main() { int n; cout<<"please input an number: "<<endl; cin>>n; cout<<Fibonacci(n)<<endl; return 0; } int Fibonacci(int index) //队列实现 { if(index<1) { return -1; } queue<int>q; q.push(1); q.push(1); for(int i=2;i<index;i++) { q.push(q.front()+q.back()); q.pop(); } return q.back(); }
(5)迭代法:
#include<iostream> using namespace std; int Fibonacci(int); int main() { int n; cout<<"please input an number: "<<endl; cin>>n; cout<<Fibonacci(n)<<endl; return 0; } int Fibonacci(int n) { int i,a=1,b=1,c=1; if(n<1) { return -1; } for(i=2;i<n;i++) { c=a+b; //辗转相加法(类似于求最大公约数的辗转相除法) a=b; b=c; } return c; }
(6)二分矩阵方法(我自己还不怎么懂。。。)