fibonacci numbers简单介绍
其最早起源于著名的兔子问题,由斐波那契研究,不断发展。有趣的是与黄金分割的关系,这样一个完全是自然数的数列,通项公式却是用无理数来表达的。而且当趋向于无穷大时,前一项与后一项的比值越来越逼近黄金分割0.618(或者说后一项与前一项的比值小数部分越来越逼近 0.618)
斐波那契数列由 0 和 1 开始,之后的斐波那契数列系数就由之前的两数相加,在数学上,斐波那契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*)eg: 0、1、1、2、3、5、8、13、21、34
以下为n从0到45,可用作测试程序以及两种算法时间复杂度对比参考:
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986 102334155 165580141 267914296 433494437 701408733 1134903170
详解代码所示
主要使用C++以及C语言等代码
#include <iostream>
long Solution_1(int N);//采用递归思想,从所求项向最初项前进,得到该值后,即刻返回层层返回但不太方便的出整个数列,且时间复杂度过大,T(n)=O(2^n)
long Solution_2(int n,long *arr);//采用常规思想,由最初项向所求项发展,逐步前进。易得整个数列,并且时间复杂度较小,T(n) = O(n)
int main(int argc, const char** argv) {
int n;
int i;
long getN;
long *p;
printf("please input a number:\n");
scanf("%d", &n);
// getN = Solution_1(n);
getN = Solution_2(n, p);
printf("When n = %d ,The fibonacci number you want :%d \n", n, getN);
printf("The datailed fibonacci numbers :\n");
for (i = 0 ; i < n+1;i++){
printf("%d ", *(p+i));
}
return 0;
}
long Solution_1(int n){
if(n==0)
{
// printf("%d",0);
return 0;
}
if(n==1){
return 1;
}
return Solution_1(n-1)+Solution_1(n-2);
}
long Solution_2(int n,long *arr){
int i = 0;
arr[0] = 0;
arr[1] = 1;
for (i = 2; i <= n ; i++)
{
arr[i] = arr[i-1] + arr[i-2];
}
return arr[n];
}
以上两函数代表两种算法,具体详解请看图中代码注释。
以上均为个人见解,多有不周之处,敬请见谅