函数递归
一、递归是什么?
递归是学习C语⾔函数绕不开的⼀个话题,那什么是递归呢?
递归其实是⼀种解决问题的⽅法,在C语⾔中,递归就是函数⾃⼰调⽤⾃⼰。
写⼀个史上最简单的C语⾔递归代码:
#include <stdio.h>
int main()
{
printf("hehe\n");
main();//main函数中⼜调⽤了main函数
return 0;
}
上述就是⼀个简单的递归程序,只不过上⾯的递归只是为了演⽰递归的基本形式,不是为了解决问 题,代码最终也会陷⼊死递归,导致栈溢出(Stack overflow)。
每一次函数调用,都会向内存栈区上申请一块空间。
这块空间主要用来存放函数中的局部变量,和函数调用过程中的上下文信息.
这一块空间一般叫:
函数的运行时堆栈,也叫函数栈帧空间。
|
2. 递归的限制条件
3. 递归举例
① 举例1:求n的阶乘
计算n的阶乘(不考虑溢出),n的阶乘就是1~n的数字累积相乘。第一步:分析和代码实现我们知道n的阶乘的公式: n ! = n ∗ ( n − 1)!这样的思路就是把⼀个较⼤的问题,转为⼀个与原问题相似,但规模较⼩的问题来求解的。n!---> n*(n-1)!(n-1)! ---> (n-1)*(n-2)!....直到n是1或者0时,不再拆解再稍微分析⼀下,当 n<=1 的时候,n的阶乘是1,其余n的阶乘都是可以通过上述公式计算。n的阶乘的递归公式如下:那我们就可以写出函数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太⼤的情况,n太⼤存在溢出):第二步: