【C语言-24】函数递归
函数需要被另一个函数调用才能执行,而主函数main
在程序运行时会被自动调用。
上一节中,我们写了一个名为add
的函数,并且使用主函数来调用它。
我们进一步发散思维,函数内部是否能调用自己呢?
1. 函数递归调用
#include <stdio.h>
void func(int n)
{
printf("%d\n", n);
func(n + 1);
}
int main()
{
func(0);
return 0;
}
编译可以通过,运行依次打印出了1,2,3,4,5......
说明在C语言中,在一个函数内部是可以再次调用自己的。这种调用被称之为函数递归
。
我们来分析一下func
函数递归调用的过程。
最初,func
函数在主函数main
中被调用,传入了参数0。进入func
函数后,形参n的值为0,n被printf打印。接下来将n + 1
作为参数传入func
函数,开始自己调用自己。
由于函数func
首尾相接,它将造成程序陷入死循环。就像一条蛇,咬住了自己的尾巴,整个蛇构成了一个环形。
还记得怎样打断程序执行吗?如果你的程序陷入了循环,请使用Ctrl + C
组合键结束程序。
如果你不打断程序执行,那么过不了多久,程序将出现栈溢出异常,导致程序异常结束。我们稍后讨论这个问题出现的原因。
2. 如何正确地进行递归?
很显然,我们希望程序能够正常结束,并返回结果。
我们现在有一个递推规则了,每次n
都将加1。那么我们少了什么呢?我们缺少一个递推结束条件。
递归函数的两个要素:
- 递推规则
- 递推结束条件
现在我们给程序加上递推结束条件,当n为5时,就让递推结束。
#include <stdio.h>
void func(int n)
{
if (n == 5) // n为5时,结束递推
return;
printf("%d\n", n);
func(n + 1);
}
int main()
{
func(0);
return 0;
}
下面的图中用红色线条画出了递推进入下级函数的流程,蓝色线条画出了从下级回归的流程。箭头方向和标号数字代表执行顺序。
流程在n
小于5之前,一直递推至下级函数。当n
为5时,从下级函数开始回归。
编辑于 2023-09-12 11:30・IP 属地广东