递归就是直接或间接调用自身的算法,把一个的大问题分解成同类的小问题。
下面是一个阶乘的递归实现。
- #include <stdio.h>
- int fact(int n)
- {
- if(n < 0){
- printf("the number must be larger than 0\n");
- return -1;
- }
- return n <= 1 ? 1:n*fact(n-1); //n = 1是递归结束条件
- }
- int main()
- {
- int n = 0;
- int total;
- printf("Please input the number:");
- scanf("%d",&n);
- total = fact(n);
- printf("total = %d\n",total);
- return 0;
- }
递归很容易实现,但是递归的缺点也不小。因为函数调用次数非常多,所以开销很大,效率低。而且,因为给函数传递的参数要压栈,函数本身的局部变量也要放入栈,所以,如果递归层次太深,很容易造成栈溢出。
下面是循环实现,循环不像递归有那么大的函数调用开销,也不用担心栈溢出,注重效率的地方最好用循环代替递归。
- int main()
- {
- int n = 0;
- int total = 1;
- printf("Please input the number:");
- scanf("%d",&n);
- if(n < 0){
- printf("the number must be larger than 0\n");
- return -1;
- }
- for(; n >= 0; n--){
- if(n == 0)
- break;
- total *=n;
- }
- printf("total = %d\n",total);
- }
阅读(3216) | 评论(0) | 转发(2) |