C语言函数详解(2)

news2025/2/26 5:34:22

目录

函数的声明和定义

函数声明

 函数定义

 函数递归

什么是递归

递归的两个必要条件

练习1

 练习2

 练习3

练习4


函数的声明和定义

函数声明

1. 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数声明决定不了。
2. 函数的声明一般出现在函数的使用之前。要满足先声明后使用
3. 函数的声明一般要放在头文件中的。

 函数定义

函数的定义是指函数的具体实现,交待函数的功能实现。

test.h文件放置函数的声明

test.c文件放置函数的实现

未来工程中,代码是比较多的,函数一般是放在.h文件中声明,.c文件中实现的!

为什么要将代码拆成.c .h的文件呢?可能主要出于以下两点考虑:

1.多人协作

2.代码保护

拓展知识:在一个工程中这么多.c文件,它们最终是怎么链接到一起的呢?(以VS2019集成开发环境为例)

 函数递归

什么是递归

程序调用自身的编程技巧称为递归( recursion)。
递归做为一种算法在程序设计语言中广泛应用。

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

递归=递推+回归

递归的两个必要条件

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

练习1

接受一个整型值(无符号),按照顺序打印它的每一位。
例如:输入:1234,输出 1 2 3 4

思路:构造函数Print

//Print(1234)

//Print(123)  +  4

//Print(12)  +  3

//Print(1)  +  2

void Print(int n)
{
	if (n > 9)
	{
		Print(n / 10);
	}
	printf("%d ", n % 10);
}
int main()
{
	int n = 0;
	scanf("%d",&n);
	Print(n);
	return 0;

 上述代码的图解:

 

 注:函数之所以能实现调用,能实现递归,都是因为,函数在调用的时候会维护一个函数栈帧(内存上的一块区域),函数调用开始,函数栈帧创建,函数调用结束,栈帧销毁。

 练习2

编写函数不允许创建临时变量,求字符串的长度。

思路:构造my_strlen()

//my_strlen("abc")

//1+my_strlen("bc")

//    1+my_strlen("c")

//         1+my_strlen("")

size_t my_strlen(char* p)
{
	size_t len = 0;
	if (*p != '\0')
	{
		return 1 + my_strlen(p + 1);
	}
	return 0;
}
int main()
{
	char str[] = "abc";
	size_t len = my_strlen(str);
	printf("%zd\n", len);
	return 0;
}

注:size_t 是一种类型,是无符号整型的,size_t就是为sizeof设计的,size_t类型的数据打印的时候使用%zd。

上述代码的图解:

 练习3

求n的阶乘。(不考虑溢出)

int Fac(int n)
{
	if (n <= 1)
		return 1;
	else
		return n* Fac(n - 1);
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = Fac(n);
	printf("%d\n",ret);
	
	return 0;
}

练习4

求第n个斐波那契数。(不考虑溢出)

int Fib(int n)
{
	if (n <= 2)
		return 1;
	else
		return Fib(n-1) + Fib(n - 2);
	
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret =Fib(n);
	printf("%d\n", ret);
	return 0;
}

但是我们发现有问题:
在使用 fib 这个函数的时候如果我们要计算第50个斐波那契数字的时候特别耗费时间。
使用 factorial 函数求10000的阶乘(不考虑结果的正确性),程序会崩溃。

为什么呢?我们发现 fib 函数在调用的过程中很多计算其实在一直重复。

那怎么解决呢?将函数改成非递归!

int Fib(int n)
{
	int a = 1;
	int b = 1;
	int c = 1;
	while (n>=3)
	{
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;
	
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret =Fib(n);
	printf("%d\n", ret);
	return 0;
}

函数本章完结撒花~

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

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

相关文章

一键部署 Umami 统计个人网站访问数据

谈到网站统计&#xff0c;大家第一时间想到的肯定是 Google Analytics。然而&#xff0c;我们都知道 Google Analytics 会收集所有用户的信息&#xff0c;对数据没有任何控制和隐私保护。 Google Analytics 收集的指标实在是太多了&#xff0c;有很多都是不必要的&#xff0c;…

我被一位美女程序员夸了!

见字如面&#xff0c;我是军哥&#xff01; 昨天晚上&#xff0c;一位美女程序员&#xff08;为什么说是美女&#xff0c;因为我有她的简历照片&#xff09;读者主动找我聊天&#xff0c;说之前买我的《技术人核心能力》课程终于看完了&#xff0c;受益匪浅&#xff0c;并且有些…

【QT】 QSS样式表设计一文了解

很高兴在雪易的CSDN遇见你 &#xff0c;给你糖糖 欢迎大家加入雪易社区-CSDN社区云 前言 本文分享QT界面设计中的QSS样式技术&#xff0c;主要从**、**和**方面展开&#xff0c;希望对各位小伙伴有所帮助&#xff01;学会了QSS样式设计&#xff0c;就可以开动你的审美&#…

【腾讯云 Cloud Studio 实战训练营】基于Python实现的快速抽奖系统

文章目录 ⭐️ Cloud Studio - 简介&#x1f31f; 操作步骤&#x1f31f; 注册Cloud Studio&#x1f31f; 创建工作空间&#x1f31f; 启动对应的开发环境 ⭐️ 抽奖系统项目介绍⭐️ 抽奖系统代码结构图⭐️ 项目基础类 - 文件检查&#x1f31f; base.py 基础类文件检查示例如…

【踩坑系列记录 】Anaconda环境将torch由cpu换成gpu

概要 很早前做过深度学习&#xff0c;配环境之类的坑由于没记录都记不清了。这段时间开始做深度学习的项目&#xff0c;于是用Anaconda给项目创建了一个环境&#xff0c;其他的环境配置很顺利&#xff0c;就是到了安装pytorch时&#xff0c;我用pytorch官网的代码一直下载的是…

法学领域的技术创新点

文章目录 一、中国法研杯-2019方案分享1 相似案件检索——法律文书的相似判断方案1 -冠军方案2——三等奖 2 裁判文书论辩挖掘 二、中国法研杯2018总述Overview of CAIL2018: Legal Judgment Prediction Competition 三、中国法研杯2022-任务概述事件检测文书校对类案检索司法摘…

对留学生来说,ChatGPT究竟是福是祸?

ChatGPT&#xff0c;“出道即顶流”。教师们防ChatGPT如洪水猛兽&#xff0c;学生们使用起来依然肆无忌惮。抄袭、作弊、代写……围绕着ChatGPT的争议不绝于耳。其堪比人类的流畅写作技能和逻辑思维&#xff0c;更引发一些人的担忧&#xff1a;ChatGPT会终结大学申请文书时代吗…

智能离子风棒联网监控静电消除器的主要功能和特点

智能离子风棒联网监控静电消除器是一种集成了智能化和网络化监控功能的设备&#xff0c;用于监测和消除静电现象。它的工作原理是通过产生大量的正负离子&#xff0c;将空气中的静电中和和消除&#xff0c;从而达到防止静电积累和放电的目的。 智能离子风棒联网监控静电消除器的…

无涯教程-Perl - last函数

描述 这不是功能。 last关键字是一个循环控制语句,该语句立即导致循环的当前迭代变为最后一个。不再执行任何语句,循环结束。如果指定了LABEL,则它将退出LABEL标识的循环,而不是当前封闭的循环。 语法 以下是此函数的简单语法- last LABELlast返回值 这不会返回任何值。 …

米家/南卡/松下/明基哪款护眼台灯最值得入手?(附护眼台灯选购技巧)

写这篇文章的时候&#xff0c;我总有种悔不当初的痛感&#xff1a;上学时只喜欢造型好看的台灯&#xff0c;总是把老妈买的护眼灯丢在一边&#xff0c;导致现在眼睛高度近视。 虽然不念书了&#xff0c;但平日使用电脑浏览信息、阅读纸质书仍是抛弃不掉的生活习惯&#xff0c;…

【Java】产生死锁的必要条件和如何避免死锁

首先我们先简单了解一下什么是死锁 我们模拟A&#xff0c;B是两个资源&#xff0c;而下面是两个要抢占资源的任务 首先左边的任务执行&#xff0c;抢占了A的锁资源 当他想拿继续执行任务&#xff0c;拿B的锁资源的时候&#xff0c;B的资源被右边的任务抢走了 这时候我们应该…

OCP China Day 2023:五大社区齐聚,加速开源开放创新与落地

8月10日&#xff0c;2023年开放计算中国社区技术峰会&#xff08;OCP China Day 2023&#xff09;在北京举行。智慧时代&#xff0c;计算多元化、应用多样化、技术复杂化正驱动数据中心新一轮变革&#xff0c;开源开放社区已成为推动数据中心持续创新的重要力量&#xff0c;通过…

YOLOv5、YOLOv8改进:添加ShuffleAttention注意力机制

广泛应用的注意力机制主要有空间注意力机制和通道注意力机制&#xff0c;其目的分别是捕捉像素级的成对关系和通道依赖关系。虽然将两种机制融合在一起可以获得比单独更好的性能&#xff0c;但计算开销不可避免。因而&#xff0c;本文提出Shuffle Attetion&#xff0c;即SA&…

力扣:59. 螺旋矩阵 II(Python3)

题目&#xff1a; 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全…

【1572. 矩阵对角线元素的和】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一个正方形矩阵 mat&#xff0c;请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1&#xff1a; 输入&#xff1a;mat [[1,2,3]…

AtCoder Beginner Contest 313D题题解

文章目录 [ Odd or Even](https://atcoder.jp/contests/abc313/tasks/abc313_d)问题建模问题分析1.分析每次查询的作用2.利用异或运算的性质设计查询方法 Odd or Even 问题建模 有n个数&#xff0c;每个数为0或者1&#xff0c;最多可以进行n次询问&#xff0c;每次询问选择k个…

第04天 Spring是如何解决循环依赖的

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;每天一个知识点 ✨特色专栏&#xff1a…

推出稳定代码:人工智能辅助编码的新视野

推荐&#xff1a;使用 NSDT场景编辑器 快速助你搭建可二次编辑的3D应用场景 在不断发展的软件开发环境中&#xff0c;对效率和可访问性的追求导致了各种工具和平台的创建。最新的创新之一是StableCode&#xff0c;这是Stability AI的大型语言模型&#xff08;LLM&#xff09;生…

Flv格式视频怎么转MP4?视频格式转换方法分享

FLV格式的视频是一种早期的视频格式&#xff0c;不支持更高的分辨率和比特率&#xff0c;这意味着视频的清晰度和质量受限制&#xff0c;无法很好地保留细节和质量&#xff0c;这种格式的视频已经逐渐被更高质量的视频格式所替代&#xff0c;例如MP4格式&#xff0c;不仅具有很…

创新不辍,再结硕果 | 蓝奥声“无线联动监控技术”

随着无线电通信技术的迅速发展&#xff0c;无线远程监控系统也得到了技术上的更新&#xff0c;它将嵌入式产品与现代无线通信技术相结合&#xff0c;共同构成了一种新型的监测控制系统。物联网及其相关无线联动通信技术是智能科技快速发展的重要支撑技术之一&#xff0c;由此带…