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

news2024/12/26 9:30:29

💗个人主页💗

⭐个人专栏——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.coloradmin.cn/o/1060198.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法通过村第十二关-字符串|青铜笔记|隐形的王者

文章目录 前言转换成小写字母字符串转换整数总结 前言 提示:为别人而活着,其实是最简单的一种活法。 --蔡崇达《命运》 字符串本身并不是一种数据结构,但是由于其本身的特殊性,额可以产生很多特殊的算法问题。另外,字符…

Java之并发工具类的详细解析

3. 并发工具类 3.1 并发工具类-Hashtable Hashtable出现的原因 : 在集合类中HashMap是比较常用的集合对象,但是HashMap是线程不安全的(多线程环境下可能会存在问题)。为了保证数据的安全性我们可以使用Hashtable,但是Hashtable的效率低下。 代码实现 …

数据源报表

1.新建报表 2.新建数据集 3.维护数据源 支持的数据库还是蛮多哈 4.选择数据源表 5.编写sql 编码:SQL数据集的标识 注:避免特殊字符和_名称:SQL数据集的名称是否集合:否为单数据;是为多数据列表,如果多条数据…

MapStruct初窥门径

一、介绍 MapStruct相比于BeanUtils性能更高&#xff0c;能够实现DO&#xff0c;DTO&#xff0c;VO之间的转换&#xff0c;达到解耦合的目的 二、使用前提 添加依赖 <dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifa…

第八章 Linux文件系统权限

目录 8.1 文件的一般权限 1.修改文件或目录的权限---chmod命令 2.对于文件和目录&#xff0c;r&#xff0c;w&#xff0c;x有不同的作用&#xff1a; 3.修改文件或目录的所属主和组---chown,chgrp 8.2 文件和目录的特殊权限 三种通过字符描述文件权限 8.3 ACL 权限 1.A…

基于Java的药店管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

1500*A. Boredom(DP)

Problem - 455A - Codeforces Boredom - 洛谷 解析&#xff1a; 首先统计每个数的个数&#xff0c;并且统计出最大值mx。 问题转换为&#xff0c;从1-mx 中选择任意个数字&#xff0c;使其都不相邻&#xff0c;求最大的总和。 开始没有思路&#xff0c;以为直接选取偶数位和奇…

项目进展(七)-焊接ADS1285及其外围电路,学习芯片的SPI部分

一、焊接芯片及其外围电路 总体焊接过程没有出现什么大问题&#xff0c;也算顺利&#xff0c;下一步主要是根据SPI来编写代码&#xff0c;配置该芯片。 焊接之后的PCB如下(手工焊接&#xff0c;比较丑陋&#xff0c;哈哈哈哈) 之后测试了4.096V参考电压和晶振输出&#xff0c…

CART算法解密:从原理到Python实现

目录 一、简介CART算法的背景例子&#xff1a;医疗诊断 应用场景例子&#xff1a;金融风控 定义与组成例子&#xff1a;电子邮件分类 二、决策树基础什么是决策树例子&#xff1a;天气预测 如何构建简单的决策树例子&#xff1a;动物分类 决策树算法的类型例子&#xff1a;垃圾…

长时序栅格数据缺失值插补

长时序栅格数据经常会出现一些缺失值&#xff0c;会对后续的分析造成很大的不便。这便需要利用一些插值算法对这些缺失数据进行填补&#xff0c;奇异谱分析&#xff08;SSA&#xff09;便是常用的一种插值方法。更多内容可见公众号GeodataAnalysis。 简介 在时间序列分析中&a…

处理机调度的概念,层次联系以及七状态模型

1.基本概念 当有一堆任务要处理&#xff0c;但由于资源有限&#xff0c;这些事情没法同时处理。 这就需要确定某种规则来决定处理这些任务的顺序&#xff0c;这就是“调度”研究的问题。 2. 三个层次 1.高级调度&#xff08;作业调度&#xff09; 高级调度&#xff08;作业…

websocket逆向【python实现websocket拦截】

python实现websocket拦截 前言一、拦截的优缺点优点:缺点:二、实现方法1.环境配置2.代码三、总结前言 开发者工具F12,筛选ws后,websocket的消息是这样显示的,如何获取这里面的消息呢? 以下是本篇文章正文内容 一、拦截的优缺点 主要讲解一下websocket拦截的实现,现在…

结构和基本尺寸

声明 本文是学习GB-T 586-2015 船用法兰铸钢止回阀. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了法兰连接尺寸和密封面按 CB/T 4196、GB/T 2501 的船用法兰铸钢止回阀(以下简 称止回阀)的分类和标记、要求、试验方法、检验规…

sheng的学习笔记-【中英】【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第四周测验

课程1_第4周_测验题 目录&#xff1a;目录 第一题 1.在我们的前向传播和后向传播实现中使用的 “缓存” 是什么&#xff1f; A. 【  】它用于在训练期间缓存成本函数的中间值。 B. 【  】我们用它将在正向传播过程中计算的变量传递到相应的反向传播步骤。它包含了反向传…

Linux系统编程系列之条件变量

一、什么是条件变量 条件变量是一种同步互斥机制&#xff0c;通常与互斥锁一起使用以实现线程之间的通信和同步。 二、问题的引入 先来看一个例子:小楠是一名在校学生&#xff0c;每个月都会从父母那里得到一笔生活费。现在她的钱花光了&#xff0c;想要去取钱。但是很显然取钱…

Redis-缓存穿透,缓存击穿,缓存雪崩

缓存穿透&#xff0c;缓存击穿&#xff0c;缓存雪崩 缓存穿透处理方案解决方案1 缓存空数据解决方案2 布隆过滤器 缓存击穿处理方案解决方案 1 互斥锁解决方案2 逻辑过期 缓存雪崩处理方案解决方案 1 给不同的key的过期时间设置添加一个随机值&#xff0c;降低同一个时段大量ke…

柯桥生活口语学习,英语中初次见面,除了Nice to meet you,还能说什么?

第一印象非常重要。所以当你第一次见到某人时&#xff0c;留下一个好印象很重要&#xff0c;尤其是当你面对一个重要的工作或者面对某个对你来说可能非常特别的人时。 下面我列出了一些最常用的说“很高兴见到你”的表达方法&#xff0c;也包括对方的回答&#xff0c;除了nice …

活动报名与缴费小程序开发笔记一

项目背景 活动报名与缴费小程序的开发背景主要源于以下几个因素&#xff1a; 1.数字化时代的需求&#xff1a; 随着移动互联网和智能手机的普及&#xff0c;人们习惯使用手机进行各种活动。传统的纸质报名表格和线下缴费方式变得相对繁琐&#xff0c;而数字化报名与缴费小程序…

2023年-华为机试题库B卷(Python)【满分】

华为机试题库B卷 已于5月10号 更新为2023 B卷 &#xff08;2023-10-04 更新本文&#xff09; 华为机试有三道题目&#xff0c;前两道属于简单或中等题&#xff0c;分值为100分&#xff0c;第三道为中等或困难题&#xff0c;分值为200分。总分为 400 分&#xff0c;150分钟考试…

GKR+Groth16:更快的MiMC证明

1. 引言 Consensys团队Alexandre Belling等人2022年论文 Recursion over Public-Coin Interactive Proof Systems; Faster Hash Verification 中&#xff0c;提出了&#xff1a; 用GKR来证明MiMC哈希计算的完整性将GKR verifier嵌入到SNARK&#xff08;Groth16&#xff09;电…