#include stdio.h
集宁网站制作公司哪家好,找创新互联公司!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设等网站项目制作,到程序开发,运营维护。创新互联公司从2013年创立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联公司。
unsigned int Fibonacci(int n);
int main(void) {
int n;
while (scanf ("%d", n), n 0) {
printf("%u\n",Fibonacci(n));
}
return 0;
}
unsigned int Fibonacci(int n) {
if (n = 0) return 0;
if (n == 1 || n == 2) return 1;
else {
int a[2] = {1, 1}, i = 3;
while (i = n) {
a[i % 2] = a[i % 2] + a[(i - 1) % 2];
i++;
}
return a[(i - 1) % 2];
}
}
其实这不需要递归,稍微变一下算法就行了。另外,你的printf里的格式字符串错了,应该是"%u"而不是"%d"。
可以改成非递归,不过递归改成非递归不是很容易。
此外设计递归算法时要加上约束函数和上界函数进行启发式搜索。避免搜索不必要的分支。
递归有一个堆栈的概念,那就意味着他是一个反理解的过程:就象数学递推一样,你知道第一项,第二项,又知道通项公式,那你就可以知道任何一项。
然后你看代码:fun(0)==0,fun(1)==1;是告诉你一二项。
fun(n)==fun(n-1)+fun(n-2);是告诉你通项公式。那么,你就可以知道任何一项。你这样理解就差不多了,具体机器是怎么操作的,那很复杂的,也不需要明白!!!!
非递归和递归之间
1速度。递归函数是在不断的调用本身的函数,一般函数的调用.返回,是比较费时间的,尤其是在递归深度较大时。所以个人觉得非递归的速度较好。
2.空间。递归函数很明显,始终是在入栈,只有在最后才出栈,大量的浪费了堆栈空间。在这一点上非递归肯定要比递归好。
总结。个人认为递归函数只是在程序书写上简单明了,但实际运行个人不看好。
一个是O(N) 一个是O(N*N)