【C语言】基础语法4:函数和递归

news2024/12/26 10:44:41

上一篇:控制流程结构
下一篇:数组和指针

❤️‍🔥前情提要❤️‍🔥
  欢迎来到C语言基本语法教程
  在本专栏结束后会将所有内容整理成思维导图(结束换链接)并免费提供给大家学习,希望大家纠错指正。本专栏将以基础出发,在之后的教程中将会不断学习并详细讲解C语言的基本语法及其高级用法
  上一节讲了C语言基础中的控制流程结构,接下来让我们来一起学习C语言中的函数和递归
请添加图片描述

  🍪本教程内容干货满满,跟上步伐吧~🍪


作者介绍

🎓 作者:某不知名编程爱好者📜
🗒️系列文章&专栏推荐: 🔗《华为机试题解析》 、🔗《C语言程序设计》、🔗 《MySQL数据库》
🕸️为大家推荐一款很好用的C语言刷题网站🔗点击跳转


🔖导航小助手🔖

  • 📑 函数和递归
    • 🏷️ 1. 函数的定义与声明
    • 🏷️ 2. 函数的调用与返回值
    • 🏷️ 3. 函数参数的传递方式
    • 🏷️ 4. 函数的重载与递归
    • 🏷️ 5. 递归的调用栈与堆栈溢出
    • 🏷️ 6. 递归与迭代的比较
  • ⚠️ 注意事项
  • 🌰 附:阶乘函数的完整代码示例
    • 🎀小结


📑 函数和递归

  • 函数是C语言中非常重要的概念,它可以将一段代码块封装起来,方便调用复用。在本文中,我们将介绍C语言函数的基础知识和递归的实现原理。

🏷️ 1. 函数的定义与声明

  • 函数是C语言中的一个代码块,它可以接受参数返回值。函数的定义包括函数名参数列表函数体,例如:
int add(int a, int b)
{
    return a + b;
}

这个函数名为add,接受两个int类型的参数a和b,返回它们的和。

  • 在使用函数之前,需要将其声明,告诉编译器函数的返回值类型函数名参数列表。例如:
int add(int a, int b);

这个声明告诉编译器有一个名为add的函数,它接受两个int类型的参数,返回一个int类型的值。


🏷️ 2. 函数的调用与返回值

  • 调用函数时,需要使用函数名参数列表来调用函数。例如:
int sum = add(3, 5);

这个语句将调用add函数,并将3和5作为参数传递给函数。函数执行完毕后,将返回8,将其赋值给变量sum。


🏷️ 3. 函数参数的传递方式

  • C语言中函数参数的传递方式有两种:值传递指针传递

  • 值传递是指将参数的值复制一份传递给函数。在函数内部,对参数的修改不会影响到原始的参数。例如:

void increment(int a)
{
    a++;
}

int main()
{
    int x = 3;
    increment(x);
    printf("%d\n", x); // 输出3
    return 0;
}

在这个例子中,increment函数接受一个int类型的参数a,并将其加1。在main函数中,我们将x的值传递给increment函数,但是函数内部对a的修改不会影响到x的值。

  • 指针传递是指将参数的地址传递给函数。在函数内部,可以通过指针修改原始参数的值。例如:
void increment(int *a)
{
    (*a)++;
}

int main()
{
    int x = 3;
    increment(&x);
    printf("%d\n", x); // 输出4
    return 0;
}

在这个例子中,increment函数接受一个int类型的指针a,并将其指向的值加1。在main函数中,我们将x的地址传递给increment函数,函数内部通过指针对x的值进行修改。


🏷️ 4. 函数的重载与递归

  • C语言不支持函数重载,也就是说不能定义多个同名的函数,它们的参数列表不同。但是可以使用函数指针宏定义来实现类似的功能。

  • 递归是指函数调用自身的过程。递归函数必须有一个终止条件,否则会导致无限递归。例如:

int factorial(int n)
{
    if (n == 0)
        return 1;
    else
        return n * factorial(n - 1);
}

这个函数计算n的阶乘。当n等于0时,返回1作为终止条件。否则,返回n乘以factorial(n-1)的结果。


🏷️ 5. 递归的调用栈与堆栈溢出

  • 递归调用会在内存中创建一个调用栈,用于存储每次函数调用的参数返回值。如果递归层数过多,调用栈可能会耗尽内存,导致堆栈溢出

  • 为了避免堆栈溢出,可以使用迭代算法尾递归优化。迭代算法是指使用循环代替递归实现同样的功能。尾递归优化是指将递归函数转换为迭代函数,可以减少调用栈的使用


🏷️ 6. 递归与迭代的比较

  • 递归和迭代都可以实现同样的功能,但是它们的效率空间复杂度不同递归的优点是代码简洁易懂,适合处理递归结构和树形结构迭代的优点是效率高,适合处理大规模数据和循环结构

⚠️ 注意事项

  • 编写函数时应该考虑代码的可读性可维护性
  • 使用递归时应该注意控制递归深度,避免出现栈溢出等问题。
  • 使用全局变量时应该注意避免命名冲突不必要的依赖关系
  • 调用函数时应该注意参数的类型和数量,以及返回值的类型和意义

🌰 附:阶乘函数的完整代码示例

#include <stdio.h>

int factorial(int n)
{
    if (n == 0)
        return 1;
    else
        return n * factorial(n - 1);
}

int main()
{
    int n = 5;
    int result = factorial(n);
    printf("%d的阶乘是%d\n", n, result);
    return 0;
}

上一篇:控制流程结构
下一篇:数组和指针


🎀小结

函数

  • 函数是C语言中的基本组成单元,可以将一个大程序分解为若干个小程序,使程序结构更加清晰
  • 函数的定义包括函数类型函数名参数列表函数体
  • 函数的调用需要提供参数,可以通过值传递指针传递来实现。
  • 函数可以有返回值,也可以没有返回值。如果没有返回值,则使用void关键字表示。
  • 在函数内部可以使用局部变量全局变量局部变量只在函数内部有效全局变量则在整个程序中都有效

递归

  • 递归是一种函数调用自身的方法,在处理一些具有重复性质的问题时非常方便。
  • 递归需要满足两个条件:基准情形(终止条件)和递归情形(继续调用自身)。
  • 递归可能会导致栈溢出等问题,需要注意控制递归深度

⚡恭喜你的内功又双叒叕得到了提高!!!🔋

🔚以上就是C语言函数和递归的全部知识了~

🤗感谢大家的阅读~

📬后续还会继续更新💓,欢迎持续关注哟~📌

💫如果有错误❌,欢迎指正呀💫

✨如果觉得收获满满,可以点点赞👍支持一下哟~✨


在这里插入图片描述


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

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

相关文章

Cookie、Session、Token的区别

1 网站交互体验升级 1.1 无状态的 http 协议 HTTP 无状态协议&#xff0c;是指协议对于业务处理没有记忆能力&#xff0c;之前做了啥完全记不住&#xff0c;每次请求都是完全独立互不影响的&#xff0c;没有任何上下文信息。 缺少状态意味着如果后续处理需要前面的信息&…

基于蛋白-配体复合物构建药效团的药物设计(Pharmacophore)

基于蛋白-配体复合物构建药效团的药物设计&#xff08;Pharmacophore&#xff09; step 1.蛋白-配体复合物准备 点击File-->Import Structures导入之前已经下载好的1IEP.pdb&#xff08;Abl蛋白和Imatinib的晶体复合物&#xff09; 蛋白准备&#xff1a;点击Tasks--->…

【数据集实例】CMIP6气候模式数据下载-以河东地区为例

1 数据准备 主要根据研究区域等,介绍下载数据需求。 1.1 研究区域 以甘肃省河东地区为例,分区图如下所示: 数据时间范围如下所示: 历史时段:1970-2014年(共44年)预估时段:2015-2100年此外,根据研究内容,确定下载的变量为: 日尺度降水:缩写为pr日尺度最高/最低温…

OrCAD创建原理图库

OrCAD创建原理图库 概述常规器件建库方法大封装器件建库基于pinout表格创建原理图库导入方法&#xff1a; 通过fsp软件导入fpga原理图库 概述 原理图库是硬件设计的基本工作&#xff0c;每个新人都要先学会建库&#xff0c;才能开始画图&#xff0c;本文主要介绍几种常用的建库…

Linux多线程-4

在了解完多线程的绝大部分概念之后&#xff0c;我们本篇博客作为Linux多线程中的最后一篇博客&#xff0c;来对其中剩余内进行一个收尾。 目录 1.线程池 1.1引入 1.2原理 1.3优点 1.4实现 2.单例模式 2.1内容 2.2原理 2.3实现 2.3.1饿汉模式实现 2.3.2懒汉模式实现…

Web3技术入门向科普

Web3是指下一代互联网&#xff0c;它基于区块链技术&#xff0c;将各种在线活动更加安全、透明和去中心化。Web3是一个广义的概念&#xff0c;它包括了很多方面&#xff0c;如数字货币、去中心化应用、智能合约等等。在这篇文章中&#xff0c;我们将重点讨论Web3的入门知识&…

Opencv+Python笔记(四)图像的形态学处理

1.腐蚀与膨胀 膨胀用来处理缺陷问题&#xff0c;把缺陷填补掉&#xff0c;提高亮区面积&#xff1b; 腐蚀用来处理毛刺问题&#xff0c;把毛刺腐蚀掉&#xff0c;降低亮区面积。 腐蚀操作可以消除噪点&#xff0c;同时消除部分边界值&#xff0c;导致目标图像整体缩小。 膨胀…

轻松掌握安装k8s官方可视化界面工具知识点

轻松掌握安装k8s官方可视化界面工具知识点 1、安装 1、安装资源 kubernetes官方提供的可视化界面 https://github.com/kubernetes/dashboard 执行以下命令 kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml…

RocketMq集群搭建

各个角色介绍&#xff1a; producer&#xff1a;消息的发送者&#xff1b;举例&#xff1a;发信者consumer&#xff1a;消息的接受者&#xff1b;举例&#xff1a;收信者broker&#xff1a;暂存和传输消息&#xff1b;举例&#xff1a;邮局NameServer&#xff1a;管理Broker&am…

PWM输出实验

实验内容 使用TIM3来产生PWM输出 使用TIM3的通道2&#xff0c;把通道2重映射到PB5.产生PWM来控制DS0的亮度。 PWM简介 脉冲宽度调制&#xff08;PWM&#xff09;&#xff0c;简称脉宽调制&#xff0c;是利用微处理器的数字输出来对模拟电路进行控制的一种有效方法。 脉冲波…

excle表格打印相关问题

ps&#xff1a;无论是打印word,还是打印excel, 最后最好都保存成pdf&#xff0c;再打印。 ps&#xff1a;无论是打印word,还是打印excel, 最后最好都保存成pdf&#xff0c;再打印。 ps&#xff1a;无论是打印word,还是打印excel, 最后最好都保存成pdf&#xff0c;再打印。 …

Android修改头像之拍照、从相册选择、裁剪

手写一个修改头像的需求&#xff0c;头像图片支持手机拍照裁剪和从相册选择图片裁剪&#xff1b; 实现效果&#xff1a; 本节主要内容&#xff1a; 1&#xff09;头像修改对话框实现&#xff1b; 2&#xff09;调用系统相机拍照&#xff1b; 3&#xff09;自定义图片裁剪页…

centos7 配置LNMP环境

文章目录 LNMP环境的搭建LNMP工作流程FastCGI接口配置LNMP部署环境配置环境测试安装 Discuz LNMP环境的搭建 随着我们 Nginx web 服务器的流行&#xff0c;又出现了我们叫做 LNMP 的一种新的 web 环境服务组合。LNMP 就是 Linux Nginx Mysql PHP 等首字母的缩写。现在&…

STL学习+acwing 67 数字在排序数组中出现的次数

题目链接 67. 数字在排序数组中出现的次数 传统暴力解法 class Solution { public:int getNumberOfK(vector<int>& nums , int k) {int c0;for(int i0;i<nums.size();i){if(nums[i]k)c;}return c;} };容器的应用 set和multiset两个容器有一个count函数 set 为…

eBPF 虚拟机是如何工作的?

eBPF 是一个运行在内核中的虚拟机&#xff0c;很多人在初次接触它时&#xff0c;会把它跟系统虚拟化&#xff08;比如 kvm&#xff09;中的虚拟机弄混。其实&#xff0c;虽然都被称为“虚拟机”&#xff0c;系统虚拟化和 eBPF 虚拟机还是有着本质不同的。 系统虚拟化基于 x86 …

vue 中的事件修饰符介绍+示例说明

vue 中的事件修饰符介绍示例说明 Start 最近使用到 vue 的事件修饰符&#xff0c;发现由于时间太过久远&#xff0c;今天快速的过一下 vue 中的事件修饰符. 1. 官方文档 vue2 v-on 点击这里 vue3 v-on 点击这里 vue2中有关 v-on 的介绍 vue3中有关 v-on 的介绍 初步看下…

Ribbon负载均衡·入门·壹

文章目录 1 Ribbon概述1.1 什么是Ribbon1.2 Ribbon解决的问题1.3 什么是负载均衡 2 SpringCloud与Ribbon2.1 集成Ribbong工具类2.2 单独引入Ribbon 3 Ribbon实现负载均衡源码跟踪3.1 打开LoadBalanced3.2 发现Qualifier3.3 LoadBalancerAutoConfiguration自动装配类 1 Ribbon概…

C++入门(后篇)

&#x1f525;&#x1f525;本章重内容 C入门 1.auto关键字(C11)auto的使用细则auto不能使用的场景 2.基于范围的for循环(C11)3.指针空值nullptr(C11) 1.auto关键字(C11) 在早期C/C中auto的含义是&#xff1a;使用auto修饰的变量&#xff0c;是具有自动存储器的局部变量&#…

深入了解 Transformers – Part 1: 介绍 Transformer 模型

动动发财的小手&#xff0c;点个赞吧&#xff01; 自从最新的Large Language Models&#xff08;LLaM&#xff09;发布以来&#xff0c;如OpenAI的GPT系列、开源模型Bloom或谷歌发布的LaMDA等&#xff0c;Transformer展现出了巨大的潜力&#xff0c;成为了深度学习的前沿架构楷…

easyexcel内容追加与单元格合并

这里的需求是&#xff0c;如果表格不存在&#xff0c;则新建表格&#xff0c;并填入数据&#xff0c;如果表格存在&#xff0c;那么就追加内容&#xff0c;并且支持单元格合并。 内容追加&#xff0c;需要分两种方式插入&#xff0c;第一种就是没有表格&#xff0c;需要生成表头…