斐波拉契数列
题目描述
斐波那契数列是一组第一位F1
和第二位F2
为1,从第三位开始,后一位是前两位和的一组递增数列Fn
=Fn-1
+Fn-2
。
那么当n
比较大时,Fn
也非常大,现在我们想知道,第n
项,Fn
等于多少
如:
输入格式
输入包含一个整数n。
输出格式
输出一行,包含一个整数,表示Fn。
样例输入10
此时Fibonacc[ ] = {1,1,2,3,5,8,13,21,34,55}
样例输出55
样例输入28
此时Fibonacc[ ] = {1,1,2,3,5,8,13,21,34,55…,10946,17711}
样例输出317811
题目分析
数组前两位默认为1,那么就可以从第三位开始,或者在计算的时候实现一个判断,将前两位返回1。实现方式有许多
代码实现
数组方式
#include<stdio.h> #include<stdlib.h> int main(){ int *num; int n; scanf("%d",&n); num=(int *)malloc(n*sizeof(int)); for(int i=0;i<n;i++){ if(i<2) num[i]=1; else num[i]=num[i-1]+num[i-2]; } printf("%d\n",num[n-1]); free(num); }
|
递归方式
#include <iostream> using namespace std; int Fibonacc(int n){ if(n==1||n==2) return 1; else return Fibonacc(n-2)+Fibonacc(n-1); } int main(){ int n; cin>>n; cout << Fibonacc(n)<<endl; return 0; }
|
非递归方式
#include <iostream> using namespace std; int Fibonacc(int n){ int f_left=1; int f_right=1; int f_n=0; if(n==1||n==2) return 1; else{ for(int i=2;i<n;i++){ f_n=f_left+f_right; f_left=f_right; f_right=f_n; } } return f_n; } int main(){ int n; cin>>n; cout << Fibonacc(n)<<endl; return 0; }
|
运行结果
10 55 -------------------------------- Process exited with return value 0 Press any key to continue . . .
|
28 317811 -------------------------------- Process exited with return value 0 Press any key to continue . . .
|
总结
对于此类斐波拉契数列如果是采用数组方式,则要考虑到数组的长度定义问题,那么就需要动态定义数组长度,数组分别记录数列的每一项,占用内存则会太多,如果是采用递归,则不需要那么繁琐,依次累加最终得到最后一项,但是时间则需要太多,各个方式有利有弊。