【重生之我要苦学C语言】 函数递归

news2024/10/27 14:28:44

函数递归

什么是递归?

递归就是函数自己调用自己
递归一定是基于函数的
在任何一次函数调用中,都会申请资源,申请的是内存中栈区的资源
栈区的资源是有限的,因此函数不能无限次的递归

递归的思想

把一个大型复杂问题层层转化为一个与原问题相似,但规模较小的子问题来求解,直到子问题不能再被拆分,递归就结束了
所以递归的思考方式就是把大事化小的过程
递归中的递就是递推的意思,归就是回归的意思

递归的限制条件

递归有2个必要条件:

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

例1:写一个函数fac,用递归实现非负整数n的阶乘

分析:

5!=1* 2* 3* 4* 5 = 4!* 5
4!=1* 2* 3* 4 = 3!* 4
3!=1* 2* 3 = 2!* 3
2!=1*2 = 1!*2
1!=1
0!=1

得出

n ! = (n-1) ! * n

fac(n)= fac (n-1)* n ,n>=1时
1 ,n=0时

代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int fac(int n) {
	if (n == 0)
		return 1;
	else
		return n * fac(n - 1);
}
int main(){
	int n;
	scanf("%d", &n);
	int r = fac(n);
	printf("%d\n", r);
	return 0;
}

在这里插入图片描述

例2:顺序打印一个整数的每一位

思路:

1234%10=4 , 1234/10=123
123%10=3 , 123/10=12
12%10=2 , 12/10=1
1%10=0 ,1/10=0

用递推实现:

Print(1234)
Print(123) 4
Print(12) 3 , 4

Print(1) 2, 3 , 4

n是一位数的时候
n<=9 ,printf(“%d”,n)
n如果不是一位数
Print(n/10)+printf(“%d”,n%10)

代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void Print(int n) {
	if (n > 9) {
		Print(n / 10);
	}
	printf("%d ", n % 10);
}
int main(){
	int n;
	scanf("%d", &n);
	Print(n);//将n的每一位按顺序打印在屏幕上
	return 0;
}

在这里插入图片描述

递归与迭代

在C语言中每一次函数调用,都需要为本次函数调用在内存的栈区,申请一块内存空间来保存函数调用期间的各种局部变量的值,这块空间被称为运行时堆栈,或者函数栈帧
函数不返回,函数对应的栈帧空间就一直占用,所以如果函数调用中存在递归调用的话,每一次递归函数调用都会开辟属于自己的栈帧空间,直到函数递归不再继续,开始回归,才逐层释放栈帧空间
所以如果采用函数递归的方式完成代码,递归层次太深,就会浪费太多的栈帧空间,也可能导致栈溢出

不使用递归,可以用迭代的方式(通常就是循环的方式

例1:

计算 n的阶乘

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int fac(int n) {
	int i = 0;
	int ret = 1;
	for (i = 1;i < -n;i++) {
		ret *= i;
	}
	return ret;
}
int main() {
	int n;
	scanf("%d", &n);
	int r = fac(n);
	printf("%d\n", r);
	return 0;
}

例2:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(){
	int n;
	scanf("%d", &n);
	while (n) {
		printf("%d ", n%10);
		n /= 10;
	}
	;
	return 0;
}

一个问题比较复杂,不容易写出非递归(迭代)的代码,但是递归的方式很容易写出来,那么这个时候,如果递归没有明显缺陷,就用递归解决

例3:斐波那契数列

Fib(n)=
n<=2时 ,1
n>2时 ,Fib(n-1)+Fib(n-2)

用递归实现:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int Fib(int n) {
	if (n <= 2)
		return 1;
	else
		return Fib(n - 1) + Fib(n - 2);
}
int main() {
	int n;
	scanf("%d", &n);
	int r = Fib(n);
	printf("%d\n", r);
	return 0;

}
会进行大量的重复计算

在这里插入图片描述

所以用递推来解决:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
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;
	scanf("%d", &n);
	int r = Fib(n);
	printf("%d\n", r);
	return 0;
}

END…

愿所有角色丰盈你,却不替代你;

愿所有故事经过你,却不写目的地。

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

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

相关文章

解决docker拉取readeck镜像报Error response from daemon: toomanyrequests问题

readeck 是一个内容中心&#xff0c;目前已支持中文翻译 这是本地化部署后的效果&#xff1a; 原命令为&#xff1a; docker run --rm -ti -p 8000:8000 -v readeck-data:/readeck codeberg.org/readeck/readeck:latest Unable to find image codeberg.org/readeck/readeck:la…

数据库的诗篇:深入探索 MySQL 表操作的艺术与哲学

文章目录 前言&#x1f338;一、创建表——搭建数据存储的基础框架1.1 基本语法1.2 创建表的实际案例解释&#xff1a; 1.3 表设计的最佳实践 &#x1f338;二、查看表结构——快速了解数据库设计2.1 使用 DESC 命令解释&#xff1a; 2.2 使用 SHOW COLUMNS 命令2.3 使用 SHOW …

[MySQL#2] 库 | 表 | 详解CRUD命令 | 字符集 | 校验规则

目录 一. 库操作 1. 创建数据库 2. 字符集和校验规则 校验规则对数据库的影响 显示创建数据库时对应的命令 3. 修改数据库 4. 数据库删除 备份和恢复 还原 查看连接情况 二. 表操作 1. 创建表&#xff08;定义实例化格式 2. 创建表案例 &#xff08;实例化数据类型…

【Fargo】12:参考mediasoup 重构 udpsocket管理、定时器、uv生命周期

udp 发送的包是动态分配的内存,即使考虑rtppacket类型,也是动态分配的内存构造rtppacket,因此应该考虑对这块内存管理起来。之前的实现采用了一个固定分配的内存,可能会节省内存,固定大小虽然不够灵活,但是可以规避频繁分配导致的内存碎片。每次都动态分配一个uv_udp_sen…

vue3+vite 部署npm 包

公司需要所以研究了一下怎么部署安装&#xff0c;比较简单 先下载个vue项目 不用安准路由&#xff0c;pinna 啥的&#xff0c;只需要一个最简单的模版 删掉App.vue 中的其它组件 npm create vuelatest 开始写自定义组件 新建一个el-text 组件, name是重点&#xff0c;vue3中…

【10天速通Navigation2】(三) :Cartographer建图算法配置:从仿真到实车,从原理到实现

前言 往期内容&#xff1a; 第一期&#xff1a;【10天速通Navigation2】(一) 框架总览和概念解释第二期&#xff1a;【10天速通Navigation2】(二) &#xff1a;ROS2gazebo阿克曼小车模型搭建-gazebo_ackermann_drive等插件的配置和说明 本教材将贯穿nav2的全部内容&#xff0c…

FreeSWITCH 简单图形化界面30 - 使用MYODBC时可能遇到的错误

FreeSWITCH 简单图形化界面30 - 使用MYODBC时可能遇到的错误 测试环境1、 MYODBC 3.51.18 or higher2、分析和解决2.1 解决1&#xff0c;降级MySQL ODBC2.2 解决2&#xff0c;修改FreeSWITCH代码 测试环境 http://myfs.f3322.net:8020/ 用户名&#xff1a;admin&#xff0c;密…

双11必买物品清单有哪些?双11推荐购买清单分享

随着双11购物节的到来&#xff0c;这个由光棍节演变而来的全民狂欢节已经成为了中国乃至全球最大的在线购物盛事。对于精明的购物者来说&#xff0c;双11不仅是一个购物的好时机&#xff0c;更是一个精打细算、囤货备需的黄金时刻。那么双11必买物品清单有哪些&#xff1f;在这…

基于Arduino的LED亮灭按键控制

一、项目简介 通过一个按键控制LED的亮灭&#xff0c;实现按键按一下LED点亮&#xff0c;再按一下LED熄灭&#xff0c;交替循环。 二、控制原理 1. 按键检测原理&#xff1a; 将Arduino的监测端口设置为输入上拉模式&#xff08;INPUT_PULLUP&#xff09;&#xff0c;用于连…

C++结合图形编程与物联网:你更偏向哪种方式来学习信息学奥赛?

随着信息学奥赛在全国范围内的热度逐年攀升&#xff0c;学生和家长们越来越重视如何有效备赛。传统的编程学习方式侧重于算法和数据结构&#xff0c;但随着科技的发展&#xff0c;图形化编程与物联网&#xff08;IoT&#xff09;项目逐渐成为新兴的学习路径。通过C结合图形化编…

直播系统源码技术搭建部署流程及配置步骤

系统环境要求 PHP版本&#xff1a;5.6、7.3 Mysql版本&#xff1a;5.6&#xff0c;5.7需要关闭严格模式 Nginx&#xff1a;任何版本 Redis&#xff1a;需要给所有PHP版本安装Redis扩展&#xff0c;不需要设置Redis密码 最好使用面板安装&#xff1a;宝塔面板 - 简单好用的…

存储过程(SQL)

1.存储过程 存储过程&#xff08;Stored Procedure&#xff09;是一组为了完成特定功能的SQL语句集&#xff0c;经编译后存储在数据库中&#xff0c;用户通过指定存储过程的名字并给定参数&#xff08;如果该存储过程带有参数&#xff09;来调用执行它。 2.MySQL存储过程创建…

qt QApplication详解

一、概述 QApplication是Qt应用程序的基础类&#xff0c;负责设置和管理应用的环境。它的主要功能包括&#xff1a;初始化应用程序、管理事件循环、处理命令行参数、提供全局设置&#xff08;如样式和调色板&#xff09;以及创建和管理主窗口。通常在main函数中创建QApplicati…

基于物联网的智慧考场系统设计(论文+源码)

1. 功能设计 &#xff08;1&#xff09;温度监测与控制功能&#xff1a; 系统需要能够实时采集考场内的温度信息&#xff0c;通过DS18B20传感器获取准确的数据&#xff0c;并在OLED屏幕和APP上显示。当温度异常过高时&#xff0c;系统应自动启动继电器&#xff0c;模拟空调开启…

【网络协议栈】Tcp协议(下)的可靠性和高效性(超时重传、快速重传、拥塞控制、流量控制)

绪论: 承接上文&#xff0c;上文写到Tcp协议的结构以及对tcp协议的性能优化的滑动窗口&#xff0c;本章我们将继续了解Tcp协议的可靠性和高效性的具体展示。后面我将继续完善网络协议栈的网络层协议敬请期待&#xff01; 话不多说安全带系好&#xff0c;发车啦&#xff08;建议…

普推知产:商标初审已下,商标申请通过如何高些!

近期下来一批商标注册的初步审公告通知书&#xff0c;一些客户对商标下证要求比较高的&#xff0c;普推知产商标老杨发现&#xff0c;要像下证高核心还是在于名称&#xff0c;名称起好备用的多&#xff0c;让商标专业人士经检索后层层过滤后提报&#xff0c;通过会好很多。 普推…

CentOS 7镜像下载

新版本系统镜像下载&#xff08;当前最新是CentOS 7.4版本&#xff09; CentOS官网 官网地址 http://isoredirect.centos.org/centos/7.4.1708/isos/x86_64/ http://mirror.centos.org/centos/7/isos/ 国内的华为云&#xff0c;超级快&#xff1a;https://mirrors.huaweiclou…

计算机毕业设计Java银行存取系统 银行交易管理系统 金融数据处理 用户存取管理系统(源码+定制+开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

信息安全工程师(55)网络安全漏洞概述

一、定义 网络安全漏洞&#xff0c;又称为脆弱性&#xff0c;是网络安全信息系统中与安全策略相冲突的缺陷&#xff0c;这种缺陷也称为安全隐患。漏洞可能导致机密性受损、完整性破坏、可用性降低、抗抵赖性缺失、可控性下降、真实性不保等问题。 二、分类 网络安全漏洞可以根据…