斐波那契数指的是这样一个数列:0、1、1、2、3、5、8、13、21、……
这个数列从第三个数开始,之后的每一个数都由它前的两数相加得到。我们知道在编程中我们可以用递归和迭代两种方法求指定的斐波那契数,但这两种方法各有利弊。
区别:递归法(时间复杂度O(2^n))写出来的代码可读性强,就相当于把书上的数学公式 翻译成代码,但这种方法效率太慢了,当你求第50个斐波那契数,你的电脑可能得运算十多分钟。而且递归很容易造成栈溢出,每调用一次函数就得开辟一块空间,而求第50个斐波那契数所调用函数的次数是令人发指,同样的那在栈上开辟的空间大小也就可想而知,栈溢出就很正常了。
迭代法:(时间复杂度O(N))相对而言迭代法的运算效率就高的多了,迭代是通过循环来求的,只要创建3个临时变量,就能很快的求出斐波那契数,而且速度快的一匹(那怕求第100斐波那契数也只是一瞬间的事),但迭代法的代码可读性较弱,而且初学者也不容易写出这种代码。
---------------------
作者:Tianzez
来源:CSDN
原文:https://blog.csdn.net/tianzez/article/details/78443321
版权声明:本文为博主原创文章,转载请附上博文链接!
下面是代码:
- 递归法
int Fab(int n){ if(n == 0) return 0; if(n == 1) return 1; return Fab(n-1) + Fab(n-2); }
- 迭代法
long long Fibnacci(unsigned n){ int result[2] = {0,1}; if(n < 2) return result[n]; long long fibNMinusOne = 0; long long fibNMinusTwo = 1; long long fibN = 0; for(int i = 2;i <= n;i++){ fibN = fibNMinusOne + fibNMinusTwo; fibNMinusOne = fibNMinusTwo; fibNMinusTwo = fibN; } }