谈到斐波那契数列数组
常想到的是递归,因为在电脑中存储数据是开辟栈来存储,如果所要计算的值太大,要面对两个问题,一个是时间问题:对一数的计算,递归和回溯过程当中会重复对一个值(例如f(3))进行开辟空间释放空间,于是会十分耗时;另外一个问题是空间问题:因为系统分给程序的栈空间是有限的,当数字太大,最终产生的栈空间的状况,即栈溢出,致使咱们没法计算。ide
第二个想到的是经过数组来存储,即将每个计算后的值都存到数组里,虽然解决了在时间上的问题,但也会出现栈溢出,没法计算大的斐波那契数。操作系统
为了解决大数问题同时提升时间上的效率咱们采用迭代的方法(实际上经过循环来实现)。
下面为其代码描述:code
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> int main() { int number; int first, second, third; scanf("%d", &number); first = 1; second = 1; if (number < 3) third = 1; while (number >= 3) { third = first + second; first = second; second = third; number--; } printf("%d\n", third); system("pause"); return 0; }
在Linux操做系统下可看出二者计算同一个f(n)迭代所须要的时间比递归所须要的时间要少的多多多。。并且所求的数多大均可以,由于没有限制,只是进行加法和赋值运算,也没有须要不少的空间。
经过该例子,可发现迭代的实现每每比递归实现效率高,但并非递归就没有自身的优势。
递归至关于其余方法,他的可读性很高,另外当一个问题很复杂时,使用迭代或其余方法会很难实现(例如Hanoi问题,青蛙跳台阶问题)此时用递归思想能够将问题简洁明了的解决,这样就补偿了他所带来的运行时开销。递归