自学C++,做书后一道题时出了点问题
问题是让求出Fibonacci数列第n项,其数列特点是前两项都是1,以后每项是前两项之和
我是这么写的
#include "stdafx.h"#include <iostream>using namespace std;int main(){ int a[3] = {0,1,1}; int n = 0,m = 0; //n第n项 while(n!= 2008) //为了测试方便,可以多次输入 { cin>>n; if(n==1) { cout<<a[1]<<endl; } else if(n==2) { cout<<a[2]<<endl; } else { while(m!=n-2) { a[0] = a[1]; a[1] = a[2]; a[2] = a[0] + a[1]; m = m+1; } cout<<a[2]<<endl; } } system("pause"); return 0;}
#include <iostream>using namespace std;unsigned long fibo(unsigned long n){ if(n == 0 || n == 1) { return n; } else { return fibo(n - 1) + fibo(n - 2); }}int main(int arg, char* argv[]){ unsigned long n = 0; while(n != 2008) { cin >> n; cout << fibo(n) << endl; } return 0;}
[解决办法]
LS递归是很经典的方法,不过缺点也很明显,就是一旦数据量过大就会导致运行时间很长。
贴个我自己写过的循环代码:
#include <iostream>using namespace std;long fib(int n);void main(){ int num; while(cin>>num) cout<<"The nth num in Fibonacci is: "<<fib(num)<<endl;}long fib(int n){ long x = 0, y = 1; for (int j = 1; j < n; j++) { y = x + y; x = y - x; } return y;}
[解决办法]
用一个位集标识一下哪个位置的元素被计算过了,就直接得到就好了,加不了多少代码