黑马程序员(两张图看懂C语言当中的嵌套、递归调用)

在C语言当中,大家都一致认为函数和指针部分的内容比较,并且是C语言里面很重要的基本组成元素。一个完整的应用程序是不可能在一个函数里面实现所有我们想要的功能。通常程序都是由很多的功能而且不同的函数功能来实现。并且在函数之间会存在互相调用的情况。本篇文章就针对函数的调用方式、嵌套调用和递归调用进行详细地讲解。
函数的调用方式
函数在C语言当中的作用众所周知,如果我们想要实现函数的功能,就必须要学会的是正确的使用或者是调用函数。在C语言里面,调用函数的具体语法的格式如下:
函数名([[实参列表1],[实参列表2],...])
我们可以从上一行的各市里面看出来,在我们调用一个函数的时候,需要明确函数的名字和实参列表。实参列表当中的参数可以是常量、变量、表达式或者是空的,各个参数之间使用的是英文逗号分割。
根据函数在程序中出现的位置,可以有下面三种函数的调用方式:
(1)将函数作为表达式调用
首先函数作为表达式调用的时候,函数的返回值是参与表达式的运算的,这个时候要求函数是必须有返回值的。示例代码看下面:
int ret1 = max(100, 150);
(2)把函数作为语句调用
【黑马程序员(两张图看懂C语言当中的嵌套、递归调用)】函数以语句的形式出现的时候,我们可以把函数作为一条语句来调用。示例代码:
printf("Hello, world!\n");
(3)将函数作为实参调用
将函数作为另外一个函数的实参的时候,那么要求这个函数是要有返回值的。如下:
printf("%d\n", max(100, 150));
在上面的语句当中,将函数max()的返回值当做printf()函数的实参来使用
嵌套调用
在C语言当中函数的定义一定是独立的,及时一个函数不可以定义在另一个函数的内部,但是在调用函数的时候,可以在一个函数中调用另外的一个函数。这是函数的嵌套调用。我们通过一个案例来演示一下函数的嵌套调用:
黑马程序员(两张图看懂C语言当中的嵌套、递归调用)
文章图片
上面这27行代码所出现的运行结果如下图:
黑马程序员(两张图看懂C语言当中的嵌套、递归调用)
文章图片
在上面的例子中, main()函数中调用了max4()函数,那么max4()函数又调用了max2()的函数。我们都知道编程最重要的就是思维。下面我们通过一张流程图更好的理解一下这个执行过程:
黑马程序员(两张图看懂C语言当中的嵌套、递归调用)
文章图片
我们来解释一下这个步骤:
首先是执行main()函数的开头部分
当遇到了函数调用语句,调用的max4()函数,流程就会转向max4()函数的入口
之后是执行max4的函数开头的部分
遇到了函数调用语句,之后调用了max2()函数,流程这个时候转向max2()函数入口
执行了max2()函数,如果再无其他的嵌套函数,就会完成max2()函数的全部操作了
这时候会返回到max2()函数中调用max4()的函数位置
从而继续执行max4()的函数中还没有执行的部分,一直到max4()函数的结束
返回main()函数里调用max4()函数的位置
这时候继续执行main()函数的剩余部分一直到结束
黑马程序员(两张图看懂C语言当中的嵌套、递归调用)
文章图片
3.递归函数
在数学当中,会遇到计算多个联系自然数之和的情况。比如说我们要计算1~n之间的自然数的和,那么就需要先计算1+2的结果,然后再去+3,从而再次得到一个结果+4,以此类推,一直到1~(n-1)之间所有的数的和+n。
在程序里面,想要完成上面的功能,这里就需要用到的是函数的递归调用了。所谓的递归调用也就是函数内部调用自身的过程。这里要注意的是,递归的话必须要求有结束条件的,不然就会陷入无限递归的循环当中,最后无法结束调用。下面还是通过刚刚说的自然数相加之和的例子,学习一下递归调用:
黑马程序员(两张图看懂C语言当中的嵌套、递归调用)
文章图片
上面16行代码所出的结果为:
黑马程序员(两张图看懂C语言当中的嵌套、递归调用)
文章图片
这里呢我们定义了一个getsum()函数用在计算1~n之间自然数的和。在上面代码中的第9行,我们可以理解成getsum()这个函数的内部调用了自身,这就是函数的递归。在这个过程里面n==1的时候结束。这个过程很复杂,但是也很重要,为了我们可以弄明白整个过程,我们按照执行过程总结一下调用:
黑马程序员(两张图看懂C语言当中的嵌套、递归调用)
文章图片
这里描述了递归调用的过程,在这个递归的过程里面getsum()函数被调用了4次,每次调用的时候,n的值都会递减的。在n的值等于1的时候,所有的递归调用函数都会以相反的顺序来相继的结束,所有的返回值会进行累加,最后我们得到的结果是0.
以上就是函数调用的全部内容。下一篇文章我们会分享外部函数与内部函数。

    推荐阅读