35.【C语言】详解函数递归
目录:
定义
作用
例子1~3
拓展学习
趣味练习
1.定义:函数自己调用自己(递推回归)
int main()
{main()return 0;
}
这样容易死循环,导致爆栈(Stack Overflow)
所以需要设立限制条件,使执行时越来越接近条件,满足限制条件时停止递归
2.作用:大事画小,小事化了(大问题变多个子问题)
3.例子1
之前写过(迭代)E5.【C语言】练习:计算n的阶乘
但不是用递归实现的
递归思路:n!=n*(n-1)!
5!=5*4!=5*4*3!=5*4*3*2!=5*4*3*2*1(逐渐展开化解问题)
写成伪代码:n!=n*fact(n-1)=n*(n-1)*fact(n-2)=...=n*(n-1)*(n-3)*...*1(递推到限制条件后,再回归,即代入数据计算)
特例:0!==1
思路:写一个函数fact(factorial n.阶乘)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int fact(int n)
{if (0 == n)//限制条件return 1;elsereturn n * fact(n - 1);
}
int main()
{int n = 0;scanf("%d", &n);int a = fact(n);printf("%d\n", a);
}
注意:每次调用时要向栈区申请内存空间来存放信息,该空间叫运行时堆栈或函数栈帧空间
计算完后销毁
4.例子2
之前写过E16.【C语言】练习:输入一个正的整数,逆序打印这个整数的每一位
不是用递归写的
现创建函数print
写成伪代码:print(1234)==printf("%d",4);+print(123);=printf("%d",4);+printf("%d",3");+print(12);=...
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int print(int n)
{if (n != 0){printf("%d", n % 10);print(n / 10);}
}
int main()
{int n = 0;scanf("%d", &n);print(n);
}
如果改成:输入一个整数,正序打印(即回归时打印)该整数的每一位
输入:1234
输出:1 2 3 4
略作改动
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int print(int n)
{if (n > 9){print(n / 10);}printf("%d ", n % 10);
}int main()
{int n = 0;scanf("%d", &n);print(n);
}
注意:当n>9时,并不会执行下面的printf(递推),一旦达到限制条件时,会printf每一位(回归)
5.例子3
求第n个斐波那契数(介绍)
这里写一个函数fbi,令fbi(0)=0; fbi(1)=1; fbi(2)=1;
核心公式是fbi(n)==fbi(n-1)+fbi(n-2)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int fbi(int n)
{if (1 == n || 2 == n){return 1;}else{return fbi(n - 1) + fbi(n - 2);}
}int main()
{int n = 0;scanf("%d", &n);int a=fbi(n);printf("%d\n", a);
}
但输入较大的数字计算很慢
可以用循环实现
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int fbi(int n)
{int sum = 0;int a = 1;int b = 1;int c = 0;if (1 == n || 2 == n){return 1;}else{while (sum < n - 2){c = a + b;a = b;b = c;sum++;}return c;}
}int main()
{int n = 0;scanf("%d", &n);int a=fbi(n);printf("%d\n", a);
}
改动后还可以打印前n个斐波那契数
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int fbi(int n)
{int sum = 0;int a = 1;int b = 1;int c = 0;if (1 == n){printf("1");}else if (2 == n){printf("1 1");}else{printf("1 1");while (sum < n - 2){c = a + b;a = b;b = c;sum++;printf(" %d",c);}return c;}
}int main()
{int n = 0;scanf("%d", &n);fbi(n);
}
6.拓展学习
*青蛙跳台阶
一共n个台阶,青蛙一次可以跳1个或2个台阶,一共有多少种跳法?
思路:可以倒推,从终点起,可以从第n-1阶跳下或第n-2阶调下
所以jump(n)=jump(n-1)+jump(n-2)
*汉诺塔
A柱有n个盘子,上小下大,现要将A柱的盘子全部移动到C盘(可以借助B柱),但要保证ABC三柱始终保持盘子上小下大且在三根柱子之间一次只能移动一个圆盘,求一共需要多少步
简单思路:仍然倒推,最终一定是n-1个盘在B柱,A柱只剩下最大的盘-->n-1=(n-2)+1 n-2个盘在B柱,A柱剩次大的盘,C柱有最大的盘-->......
7.趣味练习
2022全国乙卷,有兴趣的可以写代码试试
点击查看答案(第E21篇)
相关文章:

35.【C语言】详解函数递归
目录: 定义 作用 例子1~3 拓展学习 趣味练习 1.定义:函数自己调用自己(递推回归) int main() {main()return 0; } 这样容易死循环,导致爆栈(Stack Overflow) 所以需要设立限制条件,使执行时越来越接近条…...

【机器学习】智驭未来:机器学习如何重塑制造业的转型与升级
📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀目录 🔍1. 引言📒2. 机器学习重塑制造业生产流程🌸预测性维护:减少停机时间,提高设…...

Python爬虫(5) --爬取网页视频
文章目录 爬虫爬取视频指定url发送请求UA伪装请求页面 获取想要的数据解析定位定位音视频位置 存放视频完整代码实现总结 爬虫 Python 爬虫是一种自动化工具,用于从互联网上抓取网页数据并提取有用的信息。Python 因其简洁的语法和丰富的库支持(如 requ…...

【Unity】关于Luban的简单使用
最近看了下Luban导出Excel数据的方式,来记录下 【Unity】关于Luban的简单使用 安装Luban开始使用UnityLubanC# 扩展 安装Luban Luban文档:https://luban.doc.code-philosophy.com/docs/beginner/quickstart 1.安装dotnet sdk 8.0或更高版本sdk 2.githu…...

企业公户验证API如何使用JAVA、Python、PHP语言进行应用
在纷繁复杂的金融与商业领域,确保每笔交易的安全与合规是至关重要的。而企业公户验证API,正是这样一位默默守护的数字卫士,它通过智能化的手段,简化了企业对公账户验证流程,让繁琐的审核变得快捷且可靠。 什么是企业公…...

杰发科技Bootloader(2)—— 基于7840的Keil配置地址
序 在7840的sample代码里面有一个简单的Boot跳转APP的示例 PFlash地址从0开始 DFlash的地址从1000000开始 Boot解析 他的boot地址配置为0 Boot的代码主要是这几行,主要作用就是Flash的跳转 int main(void) {SystemClock_Config();InitDebug();printf("demo…...
cmd常用命令
在Windows操作系统中,CMD(Command Prompt)是一个强大的命令行工具,允许用户通过键入命令来执行各种系统级操作。以下是一些常用的CMD命令及其功能: 文件与目录管理 dir:显示当前目录下的文件和子目录列表。…...

PCIe 以太网芯片 RTL8125B 的 spec 和 Linux driver 分析备忘
1,下载 RTL8125B driver 下载页: https://www.realtek.com/Download/List?cate_id584 2,RTL8125B datasheet下载 下载页: https://file.elecfans.com/web2/M00/44/D8/poYBAGKHVriAHnfWADAT6T6hjVk715.pdf3, 编译driver 解压: $ tar xj…...

Python tkinter Menu菜单组件详解
好久没有更新了,今天我来领大家熟悉一下Menu组件 1.认识、了解Menu 什么是Menu menu组件是tkinter中的菜单组件,通过该组件,开发者可以为窗口设计菜单和工具栏等。(ttk还提供了treeview树形菜单,python遍历目录的两种…...

谷粒商城实战笔记-46-商品服务-API-三级分类-配置网关路由与路径重写
文章目录 一,准备工作1,新增一级菜单2,新增二级菜单 二,前端树形界面开发1,开发分类展示组件 三,远程调用接口获取商品分类数据1,远程调用2,路由配置 错误记录 本节的主要内容&#…...

简要了解sql注入
sql注入安全测试中危害 数据库中的数据,对数据库数据进行操作(查询、删除等);网站的权限,找到注入点后可后门写入; sql注入产生原理详细分析 可控变量,带入数据库查询,变量未存在…...
Java 扫雷游戏
程序分析 使用Java编写的扫雷游戏界面程序,主要内容总结如下: Frame类继承自JFrame,构建了扫雷游戏的界面。 包含文本框text、标签nowBomb和setBomb、按钮start、面板MenuPamel和bombPanel等组件。通过jbInit方法进行初始化设置,…...

vue3 命令运行窗口暴露网络地址,以及修改端口号
一般情况下这里的地址是隐藏的 这里加上 --host 可以暴露网络地址,再加上--port --8080 就可以将端口号修改为8080(修改后边的数字就可以修改为你想要的端口号)...
由CANoe自带协议栈在TCP断开连接时同时发送两条FIN报文引起的注意事项
在我写这篇文章CAPL如何在底层模拟TCP Server端断开TCP连接时,我发现了一个奇怪的现象。我为了使用CAPL组装报文的方式实现TCP Server断开连接的过程,插入一个网络节点作为Client端。为了让Client能够发起连接和发起断开连接,给网络节点配置了独立的TCP/IP Stack,也就是CAN…...
FastGPT部署和接入使用重排模型bce-reranker-base
bce-reranker简介 bce-reranker 是一种专门用于信息检索和自然语言处理领域中的重排序(reranking)模型。这种模型由北京智源人工智能研究院(BAAI)开发,是 BGE(BAAI General Embedding)系列的一部分。BGE 系列模型专注于提供通用的嵌入表示,而 bce-reranker 则更进一步…...
Android笔试面试题AI答之线程Handler、Thread(2)
答案仅供参考,来自 讯飞星火大模型 目录 1.Android多线程间通信和多进程之间通信有什么不同,分别怎么实现?2.请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系?3.Android 线程间通信有哪几种方式?4.子线程发消息…...
某某物联rabbitmqhttp二轮充电桩协议充电协议对接
对接方式概述: 1)请求采用 http 协议方式,推送数据采用 amqp(默认 rabbitmq)点对点消息队 列方式。 2)消息队列连接信息,需贵方完善。 1 hostIp: 2 virtualHost: 3 userName: 4 pass…...

黑马JavaWeb企业级开发(知识清单)03——HTML实现正文:排版(音视频、换行、段落)、布局标签(div、span)、盒子模型
文章目录 前言一、正文排版1. 视频标签: < video >2. 音频标签: < audio >3. 换行标签: < br >4. 段落标签 < p >5. vscode实现 二、布局1. 盒子模型2. 布局标签< div >和< span >3. VScode实现 三、源代码和运行结果总结 前言 本篇文章是…...

Java | Leetcode Java题解之第283题移动零
题目: 题解: class Solution {public void moveZeroes(int[] nums) {int n nums.length, left 0, right 0;while (right < n) {if (nums[right] ! 0) {swap(nums, left, right);left;}right;}}public void swap(int[] nums, int left, int right)…...
Django REST Framework(十三)视图集-GenericViewSet
Django REST Framework 中,ModelViewSet 和 ReadOnlyModelViewSet 提供了快速实现常见视图操作的便捷方法。它们分别继承自 GenericViewSet 并组合了多个 Mixin 类,使得视图的编写变得更加简单。 ModelViewSet ModelViewSet 继承自 GenericViewSet&…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...