C语言初阶—函数(函数的声明和定义,函数递归)

        函数声明:

        1.告诉编译器有一个函数叫什么,参数是什么,返回类型是什么,但是具体是不是存在,函数声明决定不了。

        2.函数的声明一般出现在函数使用之前,要满足先声明后使用。

        3.函数的声明一般要放在头文件中。

        函数定义:

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

        函数定义在后面,在前面使用,会产生警告,因为是从前往后执行的。

        在函数使用之前,加上函数声明就不会产生警告。

        函数递归

        程序调用自身的编程技巧称为递归。

        递归作为一种算法在程序设计语言中广泛应用,一个过程或函数在其定义或说明中有直接或间接调用自身的。

        一种方法,它通常把一个大型复杂的问题层层转换为与一个与原问题相似的规模较小的问题来求解,递归策略。

        只需少量的程序就可描述出解题过程中需要的多次重复计算,大大减少了程序的代码量。

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

        递归的两个必要条件

        1.存在限制条件,当满足这个限制条件的时候,递归便不在继续。

        2.每次递归调用后越来越接近这个限制条件。

//输入1234,按位输出:1 2 3 4

把大事化小:

print(1234) ---> print(123)  4 ---> print(12)  3 4 ---> print(1) 2 3 4  ---> 1 2 3 4

#include <stdio.h>void print(int x){if(x / 10 != 0){print(x / 10);}printf("%d\n",x % 10);
}
//输入1234,输出:1 2 3 4
int main()
{int n = 0;scanf("%d",&n);print(n);return 0;
}

        自定义求字符串长度的函数

#include <stdio.h>//int my_strlen(char* ch){
//	int count = 0;
//	while(*ch != '\0')
//	{
//		count++;
//		ch++;
//	}
//		return count;
//}
//不创建临时变量,求字符串长度
int my_strlen(char* ch){if(*ch != '\0'){//return my_strlen(++ch) + 1;//这种写法虽然可以,但是会改变chreturn my_strlen(ch + 1) + 1;}elsereturn 0;
}
int main()
{int length = 0;char ch[12] = "Hello World";length = my_strlen(ch);printf("%d\n",length);system("pause");return 0;
}

        上面一种注释掉的方法是用while循环,并创建临时变量来辅助计数,也可以使用递归:

my_strlen("abc") ---> 1 + my_strlen("bc") ---> 1 + 1 + my_strlen("c") ---> 1 + 1 + 1 + my_strlen("") ---> 1 + 1 + 1 + 0 = 3

        计算k的阶乘

#include <stdio.h>//计算k的阶乘//递归实现
//int fac(int x){
//	if(x != 1)
//		return x * fac(x - 1);
//	else
//		return 1;
//}//迭代实现
int fac(int x){int i = 0;int ret = 1;for(i = 1;i <= x;i++)ret = ret * i;return ret;
}
int main()
{int k = 0;int n = 0;scanf("%d",&k);n = fac(k);printf("%d\n",n);return 0;
}

        斐波那契数列:

#include <stdio.h>//斐波那契数列
//递归
//int Fibonacci(int x){
//	if(x <= 2)
//		return 1;
//	else
//		return Fibonacci(x - 1) + Fibonacci(x - 2);
//}
//非递归
int Fibonacci(int x){int i = 0;int a = 1;int b = 1;int c = 0;if(x <= 2)return 1;elsefor(i = 3;i <= x;i++){c = a + b;a = b;b = c;}return c;
}
//1 1 2 3 5 8
int main()
{int k = 0;int n = 0;scanf("%d",&k);n = Fibonacci(k);printf("%d\n",n);return 0;
}

        系统分配给程序的栈空间是有限的,但是如果出现了死循环或死递归,这样有可能导致一直开辟栈空间,最终产生栈空间耗尽的情况,这样的现象我们成为栈溢出。

        如何解决上述问题:

1.将递归改写为非递归

2.使用 static 对象替代 nonstatic 局部对象。在递归函数设计中,可以使用static对象替代nonstatic局部对象(即栈对象),这不仅可以减少每次递归调用和返回时产生和释放nonstatic对象的开销,而且static对象还可以保存递归调用的中间状态,并且可为每个调用层所访问。

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

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

相关文章

Launch学习

参考博客&#xff1a; (1) 史上最全的launch的解析来啦&#xff0c;木有之一欧 1 ROS工作空间简介 2 元功能包 src目录下可以包含多个功能包&#xff0c;假设需要使用机器人导航模块&#xff0c;但是这个模块中包含着地图、定位、路径规划等不同的功能包&#xff0c;它们的逻…

agent内存马

搭建一个简单的Servlet项目 ServletDemo package com.naihe;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;…

vue2+若依框架plus交互 路由介绍

本周及寒假 参加了校企合作的工程过程管理&#xff0c;和学长学姐一起写项目&#xff0c;之前学了vue也没有应用&#xff0c;然后对框架很多组件的用法不太了解&#xff0c;前期耽误了一些时间。 框架模块 首先是框架模块的介绍 api存了一些系统管理及发送请求的方法 例如p…

【python】`assert`断言语句

assert是一个断言语句&#xff0c;用于在代码中检查某个条件是否为真。 如果条件为假&#xff0c;将触发AssertionError 异常&#xff0c;从而指示存在错误。

在您的下一个项目中选择 Golang 和 Node.js 之间的抉择

作为一名软件开发者&#xff0c;我总是在寻找构建应用程序的最快、最高效的工具。在速度和处理复杂任务方面&#xff0c;我认为 Golang 和 Node.js 是顶尖技术。两者在性能方面都享有极高的声誉。但哪一个更快——Golang 还是 Node&#xff1f;我决定深入一些硬核基准测试&…

java-ssm-jsp-宠物护理预定系统

java-ssm-jsp-宠物护理预定系统 获取源码——》公主号&#xff1a;计算机专业毕设大全

物联网与智慧城市:融合创新,塑造未来城市生活新图景

一、引言 在科技飞速发展的今天&#xff0c;物联网与智慧城市的融合创新已成为推动城市发展的重要力量。物联网技术通过连接万物&#xff0c;实现信息的智能感知、传输和处理&#xff0c;为智慧城市的构建提供了无限可能。智慧城市则运用物联网等先进技术&#xff0c;实现城市…

使用R语言进行Logistic回归分析(2)

一、数据集描述&#xff0c;问题要求 下表是40位肺癌病人的生存资料&#xff0c;X1表示生活行为能力平分&#xff08;1到100&#xff09;&#xff0c;X2为病人的年龄&#xff08;年&#xff09;&#xff0c;X3由诊断到进入研究的时间&#xff08;月&#xff09;&#xff0c;X4…

计算机设计大赛 深度学习火车票识别系统

文章目录 0 前言1 课题意义课题难点&#xff1a; 2 实现方法2.1 图像预处理2.2 字符分割2.3 字符识别部分实现代码 3 实现效果4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 图像识别 火车票识别系统 该项目较为新颖&#xff0c;适…

Pycharm的下载安装与汉化

一.下载安装包 1.接下来按照步骤来就行 2.然后就能在桌面上找到打开了 3.先建立一个文件夹 二.Pycharm的汉化

ABAP - SALV教程07 斑马纹显示和SALV标题

SALV设置斑马纹和标题 METHOD set_layout.DATA: lo_display TYPE REF TO cl_salv_display_settings. * 取得显示对象lo_display co_alv->get_display_settings( ).* 设置ZEBRA显示lo_display->set_striped_pattern( X ). * 设置Titlelo_display->set_list_he…

企业微信变更主体怎么改?

企业微信变更主体有什么作用&#xff1f;做过企业运营的小伙伴都知道&#xff0c;很多时候经常会遇到现有的企业需要注销&#xff0c;切换成新的企业进行经营的情况&#xff0c;但是原来企业申请的企业微信上面却积累了很多客户&#xff0c;肯定不能直接丢弃&#xff0c;所以这…

【二】【SQL】去重表数据及分组聚合查询

去重表数据 表的准备工作 去除表中重复的数据&#xff0c;重复的数据只留一份。 mysql> create table duplicate_table (-> id int,-> name varchar(20)-> ); Query OK, 0 rows affected (0.03 sec)mysql> insert into duplicate_table values-> (100,aaa)…

Day24-yum与rpm软件包管理2

Day24-yum与rpm软件包管理2 1. 配置缓存rpm包2. 为什么要缓存&#xff1f;3. 组包相关指令4. yum帮助与补全功能4.1 补全4.2 什么是yum源4.3 常见互联网 yum 源 5. 搭建局域网YUM仓库实践 1. 配置缓存rpm包 修改yum.conf配置 [rootoldboy ~]# sed -i.bak s#keepcache0#keepca…

批次大小对ES写入性能影响初探

问题背景 ES使用bulk写入时每批次的大小对性能有什么影响&#xff1f;设置每批次多大为好&#xff1f; 一般来说&#xff0c;在Elasticsearch中&#xff0c;使用bulk API进行批量写入时&#xff0c;每批次的大小对性能有着显著的影响。具体来说&#xff0c;当批量请求的大小增…

PVLAN组网实验

一&#xff0c;PVLAN类型 主VLAN 主VLAN可以由多个辅助私用VLAN组成&#xff0c;而这些辅VLAN与主VLAN属于同一子网。 辅助VLAN ① 团体VLAN&#xff1a;如果某个端口属于团体VLAN&#xff0c;那么它就不仅能够与相同团体VLAN中的其他端口进行通信&#xff0c;而且还能够与…

RFID(Radio Frequency Identification)技术笔记

一、RFID的介绍 RFID&#xff0c;全称为Radio Frequency Identification&#xff0c;即射频识别技术&#xff0c;也常被称为电子标签或无线射频识别。它是一种非接触式的自动识别技术&#xff0c;通过射频信号自动识别目标对象并获取相关数据&#xff0c;识别过程无需人工干预&…

[云原生] k8s之pod容器

一、pod的相关知识 1.1 Pod基础概念 Pod是kubernetes中最小的资源管理组件&#xff0c;Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的&#xff0c;例如&#xff0c;用于管理…

如何确保JDK版本与操作系统架构匹配?

1. 序言 最近的工作中&#xff0c;需要升级JDK版本到17.0.7&#xff0c;以解决一个JDK bug&#xff1a;JDK-8299626该bug的core dump关键字如下&#xff1a;SIGSEGV in PhaseIdealLoop::build_loop_late_post_work公司JDK团队提供的、包含JDK的基础镜像&#xff0c;有aarch64和…

Hololens2开发环境配置及项目生成部署

Hololens2开发环境配置及项目生成部署 Hololens2开发环境配置及项目生成部署一、官方文档及推荐配置说明1.官方文档介绍2.推荐配置及配置说明 二、安装步骤0.现有Visual Stuido和Unity卸载1.Windows SDK安装2.Visual Studio安装3.Unity安装4.MRTK配置 三、初次环境配置1.新建Un…