【C语言-24】函数递归

【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。那么我们少了什么呢?我们缺少一个递推结束条件

递归函数的两个要素:

  1. 递推规则
  2. 递推结束条件

现在我们给程序加上递推结束条件,当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 属地广东