递归函数就是直接或者间接的调用自己本身的函数。 接触递归的时候我们经常会看到这个程序 #include<stdio.h> #include<stdlib.h> long factorial(int n) { if (n <= 0) return 1; else return n*factorial(n - 1); } int main() { int n = 5; printf("%ld\n", factorial(n)); system("pause"); return 0; }
这就是计算阶乘的一个递归函数!!但是它真的好吗?答案是 no!这个程序的执行效率非常低,因为每次调用函数时的开销很大,不停的调用factorial()函数就要在堆栈上开辟空间(大多数编译器都是在堆栈上完成递归的),这样的函数写出来的确是不好的!而下面这个程序也完成上面的结果:
#include<stdio.h> #include<stdlib.h> long factorial(int n) { int result = 1; while (n > 1) { result *= n; n--; } return result; } int main() { int n = 5; printf("%ld\n", factorial(n)); system("pause"); return 0; }
完成5的阶乘,但是效率确高的多,这里只用到一个循环。
提起斐波那契数列大家肯定还是想到递归实现:
#include<stdio.h> #include<stdlib.h> long fibonacci(int n) { if (n <= 2) return 1; return fibonacci(n - 1) + fibonacci(n - 2); } int main() { int n = 5; printf("%ld\n", fibonacci(n)); system("pause"); return 0; }
求出斐波那契数列中的第五个数,每次求值时都会使用前面的值,每一个调用都会出发两个递归调用,额外的开销非常大。但是用迭代方法实现却是很方便:
#include<stdio.h> #include<stdlib.h> //计算Fibonacci long Fibonacci(int n) { long result = 0; long first = 0; long second = 0; result = first = 1; while (n > 2) //效率远远高于递归 { n -= 1; second = first; first = result; result = first + second; } return result; } int main() { int n = 5; printf("%ld\n",Fibonacci(n)); system("pause"); return 0; }
这个迭代的过程是这样的:
因为fibonacci数列的后一位是前两位的和
second first result
1 1 2
1 2 3
2 3 5
3 5 8
......
这个效率远高于递归。
看来递归实现一个问题并不是所有的都是好的,所以在遇到一个问题时如果你想到了递归,那么你首先应该想一下这样的递归的好处能否抵上完成它所付出的代价!
本文出自 “aiali” 博客,请务必保留此出处http://aliddd.blog.51cto.com/10780547/1710197
原文地址:http://aliddd.blog.51cto.com/10780547/1710197