一.什么是递归
简单来讲就是,函数自己调用自己,下面来看一个简单的代码:
#include <stdio.h>
int main()
{
printf("函数递归\n");
main();//main函数中又调用了main函数
return 0;
}
这个代码运行起来的结果将会是不停的输出“函数递归”这四个字。为了让大家更好的理解函数自己调用自己这一句话,所以我举了这个例子。这个例子其实是一个错误的示范,会导致这个函数无限递归下去,无限递归会出现栈溢出的错误,因为每一次调用函数,都要为这一次函数的调用分配内存空间,二内存的空间是在栈区上分配的,所以会出现栈溢出(stack overflow)的错误。
二.函数递归的限制条件
- 存在限制条件,当满足限制条件,递归停止
- 每次递归调用之后越来越接近限制条件
函数递归一定要满足上述两个条件,没有条件就会出现栈溢出,空间不足的错误,就如我上面举到的例子。
三.函数递归的举例
让我们通过一个练习来更深刻的认识函数递归
求n的阶乘,0的阶乘为1
思路:
1!= 1
2!= 1 x 2
3!= 1 x 2 x 3
4!= 1 x 2 x 3 x 4
n!= 1 x 2 x 3 x 4 x ······x n
从上面几个式子我们能得出3!= 2!x3;4!= 3!x4;那么n!= (n-1)xn.
它的递归条件就是当n=0时,停止对函数的调用,返回值为1.
#include <stdio.h>
int Fact(int n)
{
if(n > 0)//递归的限制条件
{
return n*Fact(n - 1);//对函数Fact进行多次调用
}
else
return 1;
}
int main()
{
int n = 0;
scanf("%d",&n);
int sum = Fact(n);
printf("%d! = %d\n",n,sum);
return 0;
}
让你们能更好的理解这段代码我用5!来解释一下:
上面的图片清楚的展示函数是如何将递归的,就是将实数不断的递推出去,然后将返回值不断的归回来,最后得出最终的返回值。