• 【C语言】函数的定义、传参与调用(二)



    💗个人主页💗

    ⭐个人专栏——C语言初步学习

    💫点击关注🤩一起学习C语言💯💫


     目录

    导读:

    1. 函数的嵌套调用

    1.1 什么是嵌套调用

    1.2 基础实现

    1.3 调用流程解析

     2. 函数的链式访问

    2.1 什么是链式访问

     2.2 基础实现

    3. 函数递归

    3.1 什么是递归

    3.2 递归的两个必要条件 

    3.3 用递归方法求n!

    4. 小结练习 


    导读:

    在前面,我们了解了第一部分的函数的定义、传参与调用(一),在这里我们基本了解了该怎样定义和使用一个函数。

    现在我们来进一步的学习函数的嵌套和递归💯

    1. 函数的嵌套调用

    1.1 什么是嵌套调用

    C语言的函数定义是互相平行、独立的,也就是说,在定义函数时,一个函数内不能在定义另一个函数,即不能嵌套定义,但可以嵌套调用函数。

    函数的嵌套调用指在一个函数中调用另一个函数,而被调用的函数又可以是其他函数的参数或返回值。这种嵌套调用的方式可以让程序更加灵活和高效。

    1.2 基础实现

    在调用函数时,需要注意以下几点:

    1. 函数名必须与函数定义的名称一致,包括大小写。
    2. 调用函数时,必须传递该函数所需要的参数,参数的顺序和类型必须与函数定义时一致。
    3. 如果函数没有参数,则在调用函数时应该留空参数列表

    例如:

    1. void B()
    2. {
    3. printf("Hello, World!\n");
    4. }
    5. void A()
    6. {
    7. B();
    8. }
    9. int main()
    10. {
    11. A();
    12. return 0;
    13. }

    ​ 

    1.3 调用流程解析

    ①执行main函数的开头部分

    ②遇函数调用语句,调用函数A,流程转去A函数

    ③执行A函数的开头部分

    ④遇函数调用语句,调用函数B,流程转去B函数

    ⑤执行B函数,如果再无其他嵌套的函数,则完成B函数的全部操作

    ⑥返回到A函数中调用B函数的位置

    ⑦继续执行A函数中尚未执行的部分,知道A函数结束

    ⑧返回main函数中调用a函数的位置

    ⑨继续执行main函数的剩余部分直到结束

     2. 函数的链式访问

    2.1 什么是链式访问

    在C语言中,可以使用函数的链式访问来简化对多个函数的调用过程。

    所谓链式访问,就是通过函数返回值的方式,实现对多个函数的连续调用。具体来说,就是将一个函数的返回值作为另一个函数的输入参数,从而实现多个函数的顺序调用。

     2.2 基础实现

    1. int add(int a, int b)
    2. {
    3. return a + b;
    4. }
    5. int multiply(int a, int b)
    6. {
    7. return a * b;
    8. }
    9. int main()
    10. {
    11. int x = 1;
    12. int y = 2;
    13. int z = 0;
    14. z = multiply(add(x, y), y);
    15. printf("(%d + %d) * %d = %d\n", x, y, y, z);
    16. return 0;
    17. }

    ​ 

    解析:

    我们定义了两个函数add和multiply。

    在main函数中,我们首先调用add函数,计算出x和y的和,然后将结果作为input传递给multiply函数,计算出input和y的乘积,最后将乘积的结果赋值给变量z。由于add函数返回值的类型和multiply函数的输入参数类型是一致的,所以我们可以直接将add函数的返回值作为multiply函数的输入参数,从而实现了链式访问。

    3. 函数递归

    3.1 什么是递归

    程序调用自身的编程技巧称为递归( recursion)

    递归做为一种算法在程序设计语言中广泛应用。

    一个过程或函数在其定义或说明中有直接或间接 调用自身的 一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解, 递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。

    递归的主要思考方式在于:把大事化小

    3.2 递归的两个必要条件 

    • 存在限制条件,当满足这个限制条件的时候,递归便不再继续。
    • 每次递归调用之后越来越接近这个限制条件。

    3.3 用递归方法求n!

    1. int factorial(int n)
    2. {
    3. if (n == 0 || n == 1)
    4. {
    5. return 1; // n为0或1时,阶乘为1
    6. }
    7. else
    8. {
    9. return n * factorial(n - 1); // 递归调用自身,计算n-1的阶乘
    10. }
    11. }
    12. int main()
    13. {
    14. int n = 0;
    15. scanf("%d", &n);
    16. int res = factorial(n); // 计算n的阶乘
    17. printf("%d! = %d\n", n, res);
    18. return 0;
    19. }

    解析:

    在上面的示例中,我们定义了一个递归函数factorial,用来计算n的阶乘。

    当n为0时,阶乘为1;

    否则,调用自身来计算n-1的阶乘,然后将结果与n相乘。

    在main函数中,我们调用factorial函数,计算出5的阶乘,并打印计算结果。

    4. 小结练习 

    函数的调用部分到这里基本就结束了,在闲暇实践感兴趣的小伙伴们可以做一下下面的小练习

    1. 输入4个整数,找出其中最大的数。(嵌套调用)

    2. 接受一个整型值(无符号),按照顺序打印它的每一位。(递归)

    例如: 输入:1234,输出 1 2 3 4. 

  • 相关阅读:
    使用protoc编译.proto文件生成go文件
    程序猿成长之路之密码学篇-RSA非对称分组加密算法介绍
    Jvm-Sandbox-Repeater架构
    DolphinScheduler 1.3元数据文档
    【At Coder begin 345】[D - Tiling] 回溯
    Jupyter Notebook(Anaconda)——两个环境分别修改默认打开目录(深度学习第一周番外篇)
    测试网页调用本地可执行程序(续1:解析参数中的中文编码)
    【零基础学QT】第七章 网络通信,TCP、UDP通信实验
    全流量分析应用运行和访问情况
    【基于windows desktop上的docker配置nacos,并采用宿主机访问】
  • 原文地址:https://blog.csdn.net/qq_64818885/article/details/133553139