我们在学习些新的函数时,首先我们得理解它是什么?是怎么定义的?然后去了解他的用途,最后我们自己要会用,知道用在什么地方什么时候用用的时候要注意些什么

有一个条理清晰的学习逻辑,会让我们学习起来事半功倍。

小博在这里带大家从入门到应用,用通俗易懂的文字讲清楚函数递归

一、递归是什么

递归:简单点说就是函数自己调用自己。可以理解为俄罗斯套娃,将一个大型的复杂的问题层层转化为和原问题相似的规模较小的子问题来求解,直到不能够再拆分为止。

凡事物极必反,递归也一样。递归必须是有条件的,不能够无限递归下去

:递推;:回归。你品,你细品。 🤨🤨

二、递归举例

come on !! 直接上例题:

求n!

1、用数学公式求n!

当我没有学过递归时,我脑子里根本想不到用其他的方法,只能根据数学公式,去解决这个问题。

即n!=n*(n-1)*(n-2)*......*2*1。

//用数学公式求n!
#include <stdio.h>
int main()
{int n = 0;int ret = 1;scanf("%d", &n);for (int i = 1; i <= n; i++){ret *= i;}printf("%d", ret);return 0;
}

2、用递归的方法求n!

当我学了递归之后,看到这个数学问题是有规律的,即:

//用递归方法求n!
#include <stdio.h>
int Fact(int n)
{if (n == 0)return 1;elsereturn n * Fact(n - 1);  //继续调用Fact(),直到n=1为止
}int main()
{int n = 0;scanf("%d", &n);int ret=Fact(n);    //调用函数Fact()printf("%d", ret);return 0;
}

3、分析递归过程

三、递归练习

根据上面的讲解,想必大家对递归也有了初步的了解,下面我来写一道例题,大家可以自行练习一下。

例:输入一个整数m,按照顺序打印整数的每一位。

比如:输入1234        输出1 2 3 4

1、小博分析

我们先进行分析,可以用笔写出分析过程,找出规律,往递归上靠。

小博分析:

小博刚开始分析时,发现了该过程的规律,但当小博尝试写代码去解决的时候,却写不出对应的代码,完了卡住了 😥😥,你们是不是也经常这样!!

事后,小博对自己的行为进行了反思,发现:首先我并没有捋清楚自己的思路,抱着试一试、感觉会了的态度去写,结果问题没有解决,反而还花费了大量的时间,同时心灵还受到极大的挫败感。所以,我们在写代码时,要先有清晰明了的思路之后再去写。俗话说,磨刀不误砍柴功呢!

回归正题:

按照上面小博的分析,发现是倒着打印出来该数字的,如果想正着打印的话,还需再分析

我们发现一个数的最低位是最容易得到的,要想办法把该数拆开,直到拆成一位就不用再拆了。

2、代码实现

#include <stdio.h>
void print(int m)
{if (m > 9){print(m / 10);}printf("%d ", m % 10);	
}int main()
{int m = 0;scanf("%d", &m);print(m);  //用来打印m的每一位return 0;
}

代码的流程

注意:每次调用print()函数时,就会进入该函数,再进入该函数......每一级的print() 都是来自上一步的,然而每次执行完该函数时,都会留下一个printf("%d",m);未被执行,因此执行结束后,还会一步一步返回回归到上层去执行该语句。

        此外,使用递归的时候要注意,每次递归函数的调用都会开辟属于自己的栈帧空间,称为运行时堆栈,直到函数递归不再继续,还是回归才逐释放栈帧空间。所以递归太深,就会浪费太多的栈帧空间,也可能会造成栈溢出。

        看完上述内容,是否对递归有了更深的理解呢!!然而我们要知道,递归很难想到,也不一定是最优解,但是有的地方会简化代码,让问题简单化。

学习数据结构时,会常用到递归。

好了小博今天就将到这里,欢迎大家留言评论!!

这里小博再送给大家我喜欢的一句话:“与凤凰同飞,必是俊鸟;与虎狼同行,必是猛兽。

加油!!

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

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

相关文章

路由基础(三):静态路由、动态路由、默认路由

静态路由 静态路由&#xff1a;管理员使用手工方式为路由器添加路由 三种添加静态路由的方式&#xff1a; 配置下一跳配置出接口出接口和下一跳都配置 备注&#xff1a;不配置出接口时&#xff0c;路由器会进行路由递归查询 #添加去往10.1.1.0网段的静态路由&#xff0c;下一跳…

大模型开发之:LangChain4j【附资料】

什么是 LangChain4j&#xff1f; LangChain4j 是一个专为 Java 生态系统设计的开源&#xff08;Apache 2.0 许可&#xff09;框架&#xff0c;用于简化基于大语言模型&#xff08;LLM&#xff09;的应用程序开发。它的名字和灵感来源于其"前辈"——为 Python 设计的 …

SyntaxError: Failed to execute ‘open‘ on ‘XMLHttpRequest‘: Invalid URL

这就是在ajax请求的时候URL不正确&#xff0c; 例如&#xff1a; http://192.168.124.168:8082api/v1/task/get 正确的是这样的&#xff1a; http://192.168.124.168:8082/api/v1/task/get 这个错误的来源是 baseUrl apiUrl 导致的&#xff0c; 比如baseUrl http://19…

程序代码篇---类

为什么有类&#xff1a;要理解编程语言中为什么会有 “类”&#xff0c;我们可以从日常生活的例子入手。想象你要描述 “汽车” 这个事物&#xff1a;它有属性&#xff08;颜色、品牌、排量&#xff09;它有行为&#xff08;行驶、刹车、鸣笛&#xff09;如果没有类&#xff0c…

jenkins备份迁移

1、确认Jenkins版本 在web界面操作步骤&#xff1a;登录Jenkins管理控制台点击左上角"Jenkins"图标选择"Manage Jenkins" > "About Jenkins"在页面中查看"Version"字段显示的具体版本号&#xff08;如2.479.2&#xff09; 建议截图…

Video Ocean 接入 GPT-5

Video Ocean&#xff1a;全球首个接入 GPT-5 的视频智能体引领 AI 视频创作革命 一、技术全景&#xff1a;Video Ocean 的架构与创新 1.1 全球首个 GPT-5 视频智能体的技术突破 Video Ocean 作为全球首个接入 GPT-5 的视频智能体&#xff0c;代表了 AI 视频生成领域的重大突…

如何在API高并发中玩转资源隔离与限流策略?

url: /posts/4ad4ec1dbd80bcf5670fb397ca7cc68c/ title: 如何在API高并发中玩转资源隔离与限流策略? date: 2025-08-27T23:26:45+08:00 lastmod: 2025-08-27T23:26:45+08:00 author: cmdragon summary: 资源隔离是保障API稳定性的核心,通过路由隔离和依赖隔离实现关键业务与…

Swift 解法详解 LeetCode 365:水壶问题

文章目录摘要描述题解答案题解代码分析代码拆解示例测试及结果时间复杂度空间复杂度总结摘要 这道题其实就是经典的 “两个水壶问题”&#xff0c;你可能在电影《虎胆龙威3》里见过&#xff0c;布鲁斯威利斯用两个水壶精确量出 4 升水来解除炸弹。这题就是把那个场景搬到了编程…

Redis集群介绍——主从、哨兵、集群

Redis集群介绍 集群里有三大模式&#xff1a; Redis主从模式&#xff1a;一主一从或一主多从&#xff0c;自带读写分离&#xff0c;负载均衡&#xff1b; Redis哨兵模式&#xff1a;高可用&#xff0c;主服务器宕机&#xff0c;从服务器变为主服务器&#xff1b; Redis集群…

【大前端】封装一个React Native与Android/IOS 端通用的埋点接口

RN 层只暴露一个统一的埋点方法&#xff0c;例如 trackEvent(eventName, params)&#xff0c;内部通过 NativeModule 调用 Android/iOS 的原生埋点 SDK。这样 RN 层不用关心具体实现。写一个通用的示例&#xff1a;1. RN 层封装统一接口&#xff08;JS 代码&#xff09;// anal…

详解 外部负载均衡器 → Ingress Controller Pod 这个过程

在常见的生产架构中&#xff1a; 外部负载均衡器&#xff08;Ng/ELB/ALB/NLB等&#xff09;终止来自客户端的 HTTPS 连接。 它将解密后的明文 HTTP 请求转发给后端的 Kubernetes Ingress Controller Pods。 Ingress Controller 处理 HTTP 请求&#xff0c;并将 HTTP 响应返回给…

Markdown 编辑器 语法

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

【PyTorch项目实战】SAM(Segment Anything Model) —— 致力于建立第一个图像分割基础模型

文章目录一、SAM&#xff08;Segment Anything Model&#xff09; —— 致力于建立第一个图像分割基础模型&#xff08;Foundation Model&#xff09;1、项目背景2、核心任务设计3、模型架构&#xff1a;图像编码器 提示编码器 掩码解码器4、核心创新&#xff1a;可提示分割任…

第一次实习总结

开发模式的转变现在虽然不怎么使用很传统的软件开发模型了&#xff0c;但是好歹也要敏捷开发吧。事实上&#xff0c;我这个小厂甚至做的更绝。全程无UML。。。需要一天&#xff1a;1.项目组长与客户进行需求对接。2.项目组长然后就找我来讲述需求&#xff0c;我就直接制作出原型…

创建uniApp小程序项目vue3+ts+uniapp

vscode创建pnpm i -D types/wechat-miniprogram uni-helper/uni-app-types{"compilerOptions": {"types": ["dcloudio/types","types/wechat-miniprogram","uni-helper/uni-app-types"] },"vueCompilerOptions": …

GitHub 热榜项目 - 日榜(2025-08-28)

GitHub 热榜项目 - 日榜(2025-08-28) 生成于&#xff1a;2025-08-28 统计摘要 共发现热门项目&#xff1a;13 个 榜单类型&#xff1a;日榜 本期热点趋势总结 本期GitHub热门项目凸显三大技术趋势&#xff1a;1) AI领域持续爆发&#xff0c;涵盖大模型系统提示研究(asgeirt…

IPV6

本节课要掌握的知识点&#xff08;学习目标&#xff09; 概括IPv6相较于IPv4的优势 (Why IPv6?) 描述IPv6的基本概念 描述IPv6报文头部的格式和原理 描述IPv6地址格式和地址类型 描述IPv6地址配置的方法和基本过程 执行IPv6地址以及IPv6静态路由的简单配置 一、IPV6 基础…

零基础开发应用:cpolar+Appsmith平民化方案

文章目录前言1.什么是Appsmith2.Docker部署3.Appsmith简单使用4.安装cpolar内网穿透5. 配置公网地址6. 配置固定公网地址总结前言 你是否也曾想搭建一个属于自己的应用&#xff0c;却被复杂的编程知识吓退&#xff1f;或者&#xff0c;想快速开发一个小工具解决工作难题&#…

【Ruoyi 解密 - 08. 前端探秘1】------ 从“交互原理”到“开发逻辑”,后端也能看懂的前端实战指南

Ruoyi-Vue3 核心知识点串讲&#xff1a;从“交互原理”到“开发逻辑”&#xff0c;后端也能看懂的前端实战指南 对于非前端工程师而言&#xff0c;学习 Ruoyi-Vue3 并非要成为专业前端开发者&#xff0c;而是要掌握“前后端交互逻辑”——搞懂数据如何从后端接口流转到前端页面…

Java SpringBoot+Mybatis-Flex+Logback实现打印日志

先看效果2025-08-26 09:52:19.834 [http-nio-10003-exec-10] INFO c.x.c.logging.RequestLoggingFilter - HTTP请求: {headers{content-length213, host192.168.31.149:10003, content-typeapplication/json, connectionkeep-alive, accept-encodinggzip, deflate, br, user-a…