7-2. 函数递归

  • 学习人数 30K+
  • 适合所有人群学习
avatar
林耿亮

你好编程主讲老师

函数需要被另一个函数调用才能执行,而主函数main在程序运行时会被自动调用。

上一节中,我们写了一个名为add的函数,并且使用主函数来调用它。

add函数调用过程解析

我们进一步发散思维,函数内部是否能调用自己呢?

1. 函数递归调用

#include <stdio.h>
void func(int n)
{
    printf("%d\n", n);
    func(n + 1);
}

int main()
{
    func(0);
    return 0;
}

func递归调用运行结果

编译可以通过,运行依次打印出了0,1,2,3,4,5......

说明在C语言中,在一个函数内部是可以再次调用自己的。这种调用被称之为函数递归

func函数递归

我们来分析一下func函数递归调用的过程。

最初,func函数在主函数main中被调用,传入了参数0。进入func函数后,形参n的值为0,n被printf打印。接下来将n + 1作为参数传入func函数,开始自己调用自己。

由于函数func首尾相接,它将造成程序陷入死循环。就像一条蛇,咬住了自己的尾巴,整个蛇构成了一个环形。

函数首尾相接

还记得怎样打断程序执行吗?如果你的程序陷入了循环,请使用Ctrl + C组合键结束程序。

递归造成的程序崩溃

如果你不打断程序执行,那么过不了多久,程序将出现栈溢出异常,导致程序异常结束。我们稍后讨论这个问题出现的原因。