目录
1.什么是递归
2.递归的限制条件
3.递归的举例
1.什么是递归
递归是指一个函数在其定义中调用自身的过程。在实现递归时,需要定义终止条件,以确保递归调用最终能够结束。递归可以简化某些问题的解决方法,并且在数据结构和算法中经常被使用。但是,由于递归本质上是通过调用函数来重复执行相同的任务,因此可能会出现内存消耗过大、时间复杂度较高等问题。
我们举一个最简单的C语言递归代码:
#include <stdio.h>
int main()
{
printf("Hello World!\n");
main();//main函数中又调用了main函数
return 0;
}
上面这个简单的递归代码不是为了解决问题的,只不过是做一个演示,最终还是陷入死递归,导致栈溢出(Stack overflow)。
2.递归的限制条件
1.栈空间限制:递归函数的调用过程需要使用堆栈空间,每次递归调用都会将一些数据压入堆栈中,如果递归调用次数过多,会导致堆栈空间不够用而导致堆栈溢出。因此,递归调用的次数不能过多,通常不要超过几千次。
2.操作系统设置的最大递归深度限制:操作系统也会限制递归调用的深度,通常只有几千到几万次调用,超过这个深度会导致堆栈溢出并使程序崩溃。操作系统设置的最大递归深度限制不同,可能会影响程序的递归效果。
3.递归的举例
3.1 计算n的阶乘
n的阶乘就是1~n的数字累积相乘。(不考虑溢出)n的阶乘的公式:n!= n * (n - 1)!
例:
5!= 5*4*3*2*1
4!= 4*3*2*1
so:5!= 5*4!
这样我们就把一个较大的问题,转换为一个与原问题相似的解法进行求解。
n!= n*(n - 1)!
这里我们写出函数Fact求n的阶乘,假设Fact(n)就是求n的阶乘,那么Fact(n - 1)就是求n - 1的阶乘,函数如下:
int Fact(int n)
{
if (n <= 0)
return 1;
else
return n * Fact(n - 1);
}
代码实现:
#include <stdio.h>
int Fact(int n)
{
if (n == 0)
return 1;
else
return n * Fact(n - 1);
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Fact(n);
printf("%d\n", ret);
return 0;
}
这里的n不能太大,否则会存在溢出的情况。