【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. 如果函数没有参数,则在调用函数时应该留空参数列表

例如:

void B()
{printf("Hello, World!\n");
}
void A()
{B();
}
int main()
{A();return 0;
}

​ 

1.3 调用流程解析

①执行main函数的开头部分

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

③执行A函数的开头部分

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

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

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

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

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

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

 2. 函数的链式访问

2.1 什么是链式访问

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

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

 2.2 基础实现

int add(int a, int b) 
{return a + b;
}
int multiply(int a, int b) 
{return a * b;
}
int main() 
{int x = 1;int y = 2;int z = 0;z = multiply(add(x, y), y);printf("(%d + %d) * %d = %d\n", x, y, y, z);return 0;
}

​ 

解析:

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

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

3. 函数递归

3.1 什么是递归

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

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

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

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

3.2 递归的两个必要条件 

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

3.3 用递归方法求n!

int factorial(int n) 
{if (n == 0 || n == 1) {return 1;  // n为0或1时,阶乘为1}else {return n * factorial(n - 1);  // 递归调用自身,计算n-1的阶乘}
}
int main() 
{int n = 0;scanf("%d", &n);int res = factorial(n);  // 计算n的阶乘printf("%d! = %d\n", n, res);return 0;
}

解析:

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

当n为0时,阶乘为1;

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

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

4. 小结练习 

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/124475.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《深度不确定条件下的决策:从理论到实践》PDF

制定未来计划时需要预测变化,尤其是制定长期计划或针对罕见事件的计划时。当这些变化存在高度不确定性的时候,这种预期就变得越来越困难。 今天给大家介绍的这本《深度不确定条件下的决策:从理论到实践》正是解决以上问题的良方。完整书籍文…

聊聊分布式架构——Http到Https

目录 HTTP通信协议 请求报文 响应报文 持久连接 状态管理 HTTPS通信协议 安全的HTTPS HTTP到HTTPS的演变 对称加密 非对称加密 混合加密机制 证书机构 SSL到底是什么 HTTPS是身披SSL外壳的HTTP HTTP通信协议 一次HTTP请求的通信流程:客户端浏览器通过…

GET 和 POST的区别

GET 和 POST 是 HTTP 请求的两种基本方法,要说它们的区别,接触过 WEB 开发的人都能说出一二。 最直观的区别就是 GET 把参数包含在 URL 中,POST 通过 request body 传递参数。 你可能自己写过无数个 GET 和 POST 请求,或者已经看…

【生物信息学】使用谱聚类(Spectral Clustering)算法进行聚类分析

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 3. IDE 三、实验内容 0. 导入必要的工具 1. 生成测试数据 2. 绘制初始数据分布图 3. 循环尝试不同的参数组合并计算聚类效果 4. 输出最佳参数组合 5. 绘制最佳聚类结果图 6. 代码整合 一、实验介绍…

黑马头条项目环境搭建

注册中心网关配置 spring:cloud:gateway:globalcors:add-to-simple-url-handler-mapping: truecorsConfigurations:[/**]:allowedHeaders: "*"allowedOrigins: "*"allowedMethods:- GET- POST- DELETE- PUT- OPTIONroutes:# 平台管理- id: useruri: lb://…

C++项目:【高并发内存池】

文章目录 一、项目介绍 二、什么是内存池 1.池化技术 2.内存池 3.内存池主要解决的问题 4.malloc 三、定长的内存池 四、高并发内存池整体框架设计 1.高并发内存池--thread cache 1.1申请内存: 1.2释放内存: 1.3用TLS实现thread cache无锁访…

HTTP协议,请求响应

、概述 二、HTTP请求协议 三、HTTP响应协议 四、请求数据 1.简单实体参数 RequestMapping("/simpleParam")public String simpleParam(RequestParam(name "name" ,required false ) String username, Integer age){System.out.println (username "…

Vue中如何进行日历展示与操作

在Vue中创建交互式日历应用 在Web开发中,创建一个交互式的日历应用是一项常见的任务。Vue.js作为一个流行的JavaScript框架,提供了许多便捷的工具和组件来简化日历的开发。本文将介绍如何使用Vue来创建一个简单但功能强大的日历应用,包括展示…

经典场的量子化

专栏目录: 高质量文章导航-持续更新中-CSDN博客 前置:复指数引起的思考 往指数函数e上丢一个复矢量出来的也是一个复矢量 其定义参考之前的文章群论-李代数_GZVIMMY的博客-CSDN博客 进一步了解下复矢量空间 首先了解下复球面(用一个球表示了所有的复数) 形如[x,y]的二维实…

Linux网络编程:详解https协议

目录 一. https协议概述 二. 中间人截获 三. 常见的加密方法 3.1 对称加密 3.2 非对称加密 四. 数据摘要和数据签名的概念 五. https不同加密方式的安全性的探究 5.1 使用对称加密 5.2 使用非对称加密 5.3 非对称加密和对称加密配合使用 六. CA认证 七. 总结 一.…

第十二届2023软件杯国家二等奖赛后感想总结

一,相关链接 软件杯官网:软件杯大赛官网 (cnsoftbei.com) 金蝶赛道:金蝶云苍穹开发者门户 (kingdee.com) 二,个人介绍 首先我是个双非院校的学生,专业为计算机科学与技术,打这个比赛是在大二下的暑假开始的…

jsbridge实战1:xcode swift 构建iOS app

[[toc]] 环境安装 macOs: 10.15.5 xcode: 11.6 demo:app 创建 hello world iOS app 创建工程步骤 选择:Create a new Xcode project选择:iOS-> single View App填写: project name: swift-app-helloidentifer: smile 包名language: s…