C语言递归篇章+系统讲解分析+深入理解递归+根源进行讲解+进制转换+操作环境+实例剖析+万字+百张图片精细化讲解

递归的讲解系统分析

什么是递归

本质上就是一种算法

最简单递归

栈溢出 没有限制条件 导致无穷尽的调用自己 从而溢出 最后变成死递归

 

____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

分析阶乘

无符号整形 这里不考虑溢出的情况 数值过大需要考虑溢出的情况

__________________________________________________________________________________________________________________________________________________________

递归的详解

蓝色是推:推出去 红色是归:回归

__________________________________________________________________________________________________________________________________________________________

递归具备条件以及运行逻辑

递归详解图片

代码 

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

____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

分析顺序打印数字 递归详解

简化

画图详解

保留一份n=121

每一次都保留n的数值

画图推演

代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void Fibonacci(int n)
{
	if (n > 9)
	{
		Fibonacci(n / 10);
	}
	printf("%d ", n % 10);

}

int main()
{
	int i = 0;
	scanf("%d", &i);
	Fibonacci(i);
	return 0;
}

____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

函数栈再次讲解

传参就开始开辟空间

第二次Printf申请空间

反复运行 每次调用就申请一次空间

____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

递归限制条件

 

最后 是还给操作系统 但是 每次函数栈的销毁是 由寄存器吧数值给带回去

____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

简单的说就是 递归的使用不是所有都适合的 使用递归来解决就会产生内存空间的消耗

不使用递归的话 就可以使用迭代的方法

循环是迭代的一种

阶乘

递归的不恰当书写导致的后果

____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

分析斐波那契数列

其实不是适合递归求解 因为数值过大的时候 是有问题的

迭代的方式实现 abc之间的相互迭代和转换

返回值 是c

尾递归 尾部的递归 可以用来拿来优化

代码 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int i = 0; int a = 1; int b = 1; int c = 1;
	scanf("%d", &i);
	while (i >= 3)
	{
		c = a + b;
		//b = c;
		a = b;//这里之所以是先a=b再b=c的原因是 数值是从左到右进行增加的
		b = c;
		i--;
	}
	printf("%d", c);
	return 0;
}

//在斐波那契数列中,
// 前两个数通常是0和1,然后每个后续的数都是前两个数的和。
// 但是在你的代码中,a、b和c都被初始化为1,这意味着你的代码实际上是从第三个斐波那契数开始的计算,
// 即F(3) = 1,F(4) = 1,F(5) = 2。

____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

递归的实际操作和运用

递归的越界问题1

函数的递归经典问题剖析(为什么越界会导致无限循环)+vs调试教程+关于越界问题的解释和函数栈联系-CSDN博客

__________________________________________________________________________________________________________________________________________________________

递归的计算详解

__________________________________________________________________________________________________________________________________________________________ 

递归实现次幂详解

 递归的条件某种意义上结束条件也是起始条件

代码 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>

int CIMI(int n,int k)
{
	if (k == 0)
	{
		return 1;
	}
	else
	{
		return n * CIMI(n, k - 1);
	}
}
int main()
{
	int n = 0; int k = 0;
	scanf("%d", &n);
	scanf("%d", &k);
	int sum = CIMI(n, k);
	printf("%d", sum);

	return;
}
//组合函数返回值是1 
//在这个函数中,如果k等于0,
// 返回的是1而不是0的原因是因为这个函数实现的是计算组合数的功能。
// 组合数C(n, k)表示从n个元素中选取k个元素的组合数。当k等于0时,表示不选取任何元素,
// 这种情况下只有一种可能,即空集,所以返回的是1。如果返回0的话,就表示没有任何组合,
// 这是不符合组合数的定义的。
//
//所以,如果你想要计算组合数的话,应该保持if(k == 0) { return 1; }这样的写法。12

__________________________________________________________________________________________________________________________________________________________ 

递归计算每一位的和详解

代码 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int Sumi(int n)
{
	if (n == 0)
	{
		return 0;

	}
	return (n % 10) + Sumi(n / 10);

}
int main()
{
	int i = 0; int sum = 0;
	scanf("%d", &i);
	int ret = Sumi(i);
	//printf("%d", ret);
	return 0;
}
/如果您将 Sumi 函数中的基准情况改为 return 1;
//  ,那么对于任何非零整数 n,递归将始终返回 1,因为每次递归调用都会加上 1(由于基准情况),
// 而实际上并没有计算除了最低位以外的其他位数字。
//简单说就是 如果==0 返回值是0 如果return 1 等于0的时候返回值是1 0是正常返回
//return 1表示递归调用的返回值为1。
//在递归调用过程中,每次递归都会返回一个值,
// 这些返回的值会被累加起来,最终得到最终的结果。
// 因此,当整数为0时,递归结束,返回的值为0;而当整数不为0时,
// 递归调用的返回值会被累加,最终返回的值比递归结束时的返回值多1。

 

__________________________________________________________________________________________________________________________________________________________

递归非递归实现阶乘问题详解

代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	unsigned int a = 15; 
	while (a)
	{
		printf("%d", a % 2);
		a = a / 2;

	}
	return 0;

}

unsigned int无符号整形 可以计算负数

__________________________________________________________________________________________________________________________________________________________

递归方式实现打印一个整数的每一位详解

推出去

回来

 代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void Fibonacci(int n)
{
	if (n > 9)
	{
		Fibonacci(n / 10);
	}
	printf("%d ", n % 10);

}

int main()
{
	int i = 0;
	scanf("%d", &i);
	Fibonacci(i);
	return 0;
}

____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

二进制递归

错误解释 但是递归的逻辑是对的

十进制数 15 的二进制表示从左到右是 1111。

decimalToBinary(15) // 初始调用

= decimalToBinary(7) // 15除以2得到商7余1

= decimalToBinary(3) // 7除以2得到商3余1

= decimalToBinary(1) // 3除以2得到商1余1

= 1 // 1除以2得到商0余1,这是最后一次递归调用,打印最低位1

所以,打印顺序应该是 1, 1, 1, 1, 从最高位到最低位。

举例 如果是打印 n/2

意思就是 这里是打印每次递归的数值

但是如果是%的话 就是打印每次递归数值后的取模

数值的%

意思就是

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SAP MM 采购发票输入税额,模拟时候发现没有税科目记账税额!

原因&#xff1a;行项目税额和抬头不一样导致&#xff0c;以下是调整过的截图&#xff0c;原来底下是J2

去中心化世界的奇迹:深度解析Web3

随着科技的飞速发展&#xff0c;我们正逐渐进入一个新的数字时代&#xff0c;而Web3技术正是这个时代的奇迹之一。本文将深入解析Web3&#xff0c;揭示它在构建去中心化世界方面的深远影响以及给我们带来的可能性。 什么是Web3&#xff1f; Web3是互联网的第三个时代&#xff…

低代码数字孪生平台

老子云平台 老子云平台专注于3D资源服务与应用在Web页面上的极致展示&#xff08;渲染与交互&#xff09; 老子云平台架构 核心优势-AMRT标准格式 2022年6月&#xff0c;在国家科技部科技成果鉴定中心的成果评定中&#xff0c;AMRT标准被评为国际先进成果&#xff0c;AMRT格式…

TCP常用端口号

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; 厦门微思网络​​​​​​https://www.xmws.cn 华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom 思科认证\CCNA\CCNP\CCIE Linux\RHCE\…

Git安装,Git镜像,Git已安装但无法使用解决经验

git下载地址&#xff1a; Git - 下载 (git-scm.com) <-git官方资源 Git for Windows (github.com) <-github资源 CNPM Binaries Mirror (npmmirror.com) <-阿里镜像&#xff08;推荐&#xff0c;镜…

shell脚本——函数与数组

目录 一、函数 1、什么是函数&#xff1f; 2、函数的定义与调用 2.1 函数的格式 2.2 函数的调用方法 3 、查看与删除函数 3.1 查看函数 3.2 删除函数 4、函数的返回值 5、函数的传参数 6、函数的作用范围 7、函数的递归 二、数组 1、什么是数组&#xff1f; 2、数…

【数据结构】(一)从绪论到各种线性表

目录 一、绪论Introduction 1、数据结构 2、逻辑结构&#xff08;数据元素之间的相互关系&#xff09; 3、物理结构&#xff08;数据逻辑结构在计算机中的存储形式&#xff09; 4、数据类型&#xff08;一组性质相同的值的集合及定义在此集合上的一些操作的总称&#xff09…

mysql之基本查询

基本查询 一、SELECT 查询语句 一、SELECT 查询语句 查询所有列 1 SELECT *FORM emp;查询指定字段 SELECT empno,ename,job FROM emp;给字段取别名 SELECT empno 员工编号 FROM emp; SELECT empno 员工编号,ename 姓名,job 岗位 FROM emp; SELECT empno AS 员工编号,ename …

数据结构-数组(详细讲解)

文章目录 数组数组的概述数组的图示一维数组二维数组 数组的定义一维数组的定义二维数组的定义 数组的取值赋值一维数组二维数组 数组的操作一维数组的操作索引实现指针实现 二位数组的操作矩阵转三元组矩阵的乘法 数组 数组的概述 概述&#xff1a;数组是一种线性数据结构&a…

【机器学习300问】21、什么是激活函数?常见激活函数都有哪些?

在我写的上一篇文章中介绍了感知机&#xff08;单个神经元&#xff09;的构成&#xff0c;其中就谈到了神经元会计算传送过来的信号的总和&#xff0c;只有当这个总和超过了某个界限值时&#xff0c;才会输出值。这也称为“神经元被激活”。如果想对神经网络是什么有更多了解的…

网络防御保护——课程笔记

一.防火墙 防火墙的主要职责&#xff1a;控制和防护 --- 安全策略 --- 防火墙可以根据安全策略来抓取流量之后做出对应的动作。 防火墙的分类 防火墙的发展进程 防火墙的控制 带内管理 --- 通过网络环境对设备进行控制 --- telnet&#xff0c;ssh&#xff0c;web --- 登录设备…

【Go 快速入门】包及依赖管理 | Go 第三方包发布 | 接口 | 反射

文章目录 包和依赖管理依赖管理go modgo get go.mod 文件go.sum 文件Go Modules 发布包 接口空接口接口值类型断言 反射reflect.TypeOfreflect.ValueOf结构体反射 项目代码地址&#xff1a;04-PackageInterfaceReflection 包和依赖管理 Go 使用包来支持代码模块化和代码复用&…

【Django开发】前后端分离美多商城项目:项目准备和搭建(附代码,文档)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论django商城项目开发相关知识。本项目利用Django框架开发一套前后端不分离的商城项目&#xff08;4.0版本&#xff09;含代码和文档。功能包括前后端不分离&#xff0c;方便SEO。采用Django Jinja2模板引擎 Vue.js实现…

分表过多引起的问题/Apache ShardingSphere元数据加载慢

目录 环境 背景 探寻 元数据的加载策略 如何解决 升级版本到5.x 调大max.connections.size.per.query max.connections.size.per.query分析 服务启动阶段相关源码 服务运行阶段相关源码 受到的影响 注意事项&#xff08;重要&#xff09; 其他 环境 Spring Boot 2…

数据结构3、基于栈的后缀算术表达式求值

1 题目描述 图1 中缀表达式转化为后缀表达式题目描述 图2 基于栈的后缀算术表达式求值题目描述 2 题目解读 借助一个运算符栈&#xff0c;可将中缀表达式转化为后缀表达式&#xff1b;借助一个运算数栈&#xff0c;可对后缀表达式求值。借助一个运算符栈和一个运算数栈&#xf…

MongoDB安装以及卸载

查询id&#xff1a; docker ps [rootlocalhost ~]# docker stop c7a8c4ac9346 c7a8c4ac9346 [rootlocalhost ~]# docker rm c7a8c4ac9346 c7a8c4ac9346 [rootlocalhost ~]# docker rmi mongo sudo docker pull mongo:4.4 sudo docker images 卸载旧的 sudo docker stop mong…

Win10无法完成更新正在撤销更改的解决方法

在Win10电脑操作过程中&#xff0c;用户看到了“无法完成更新正在撤销更改”的错误提示&#xff0c;这样系统就不能成功完成更新&#xff0c;不知道如何操作才能解决此问题&#xff1f;以下小编分享最简单的解决方法&#xff0c;帮助大家轻松解决Win10电脑无法完成更新正在撤销…

BIO、NIO编程与直接内存、零拷贝

一、网络通信 1、什么是socket&#xff1f; Socket 是应用层与 TCP/IP 协议族通信的中间软件抽象层&#xff0c;它是一组接口&#xff0c;一般由操作 系统提供。客户端连接上一个服务端&#xff0c;就会在客户端中产生一个 socket 接口实例&#xff0c;服务端每接受 一个客户端…

【Linux网络编程】网络编程套接字(1)

【Linux网络编程】网络编程套接字(1) 目录 【Linux网络编程】网络编程套接字(1)源IP地址和目的IP地址端口号端口号和进程ID的关系 网络通信TCP协议UDP协议网络字节序socket编程接口简单的UDP网络程序 作者&#xff1a;爱写代码的刚子 时间&#xff1a;2024.1.29 前言&#xff1…

SV-7101T网络音频终端 网络对讲终端

SV-7101是一款IP网络广播终端&#xff0c;主要作为网络播放器使用&#xff0c;其接收网络的音频数据&#xff0c;提供音频输出。SV-7101与服务器主控软件、有源音箱配套使用可实现主控室对HG7101终端进行定时打铃、实时语音广播和紧急广播等功能。 淘宝速购&#xff1a; SV-701…
最新文章