12-C++算法笔记-递推

news2024/12/27 0:05:59

算法

📖 引入

在这里插入图片描述

让我们从一个有趣的例子开始,棋盘放米的问题。假设有一个 8 × 8 8\times8 8×8 的棋盘,皇帝想要奖赏一位大臣。大臣提出的要求是在棋盘上按如下规则领赏:第一个格子上放一粒米,随后的每个格子都放置前一个格子上两倍数量的米。

这个问题涉及到一种算法思想,即递推。在递推算法中,我们使用已知的初始条件和递推规则来计算出问题的解。接下来,让我们深入了解递推算法的概念和应用。

📖 什么是递推

递推是一种基于已知条件和规则的算法思想,通过不断利用前面计算的结果来推导出后续的结果。它可以将复杂的问题拆解成简单的子问题,并使用递推规则来解决这些子问题,最终得到问题的解。

递推算法的关键是确定好初始条件和递推规则。初始条件是指已知的起始值,而递推规则则是根据已知值计算下一个值的规则。通过不断迭代应用递推规则,我们可以逐步推导出问题的解。

递推算法常用于处理具有递推关系的问题,例如数列、排列组合、动态规划等。它在编程中具有广泛的应用,能够简化问题的求解过程,并提高算法的效率。

在这里插入图片描述

很多时候,一步登天很难,但如果有个楼梯可以让我们拾阶而上,问题就会变得简单许多。

📖 递推算法练习题

现在,让我们通过两个经典的递推算法练习题来加深对递推算法的理解。

🌟 斐波那契数列

斐波那契数列是指这样的数列:数列的第一个和第二个数都为 1,接下来每个数都等于前面两个数之和。

给出一个正整数 a a a,要求斐波那契数列中第 a a a 个数是多少。

对于斐波那契数列,我们以输入 a = 7 a=7 a=7 为例,展示推演过程:

月份第1个数第2个数第3个数第4个数第5个数第6个数第7个数
数值11235813

描述:

  1. 第一个数和第二个数都为 1,作为斐波那契数列的初始值。
  2. 第三个数等于前两个数之和,即 1 + 1 = 2。
  3. 第四个数等于前两个数之和,即 1 + 2 = 3。
  4. 第五个数等于前两个数之和,即 2 + 3 = 5。
  5. 第六个数等于前两个数之和,即 3 + 5 = 8。
  6. 第七个数等于前两个数之和,即 5 + 8 = 13。

通过例子推导,可以得到递推式: F ( n ) = F ( n − 1 ) + F ( n − 2 ) F(n) = F(n-1) + F(n-2) F(n)=F(n1)+F(n2),其中 F ( n ) F(n) F(n) 表示第 n n n 个斐波那契数。

下面是使用递推算法计算斐波那契数列的代码:

#include <iostream>
using namespace std;

int fibonacci(int n) {
    if (n == 1 || n == 2) {
        return 1;
    }
    int prev = 1;
    int curr = 1;
    for (int i =

 3; i <= n; i++) {
        int temp = curr;
        curr = prev + curr;
        prev = temp;
    }
    return curr;
}

int main() {
    int a;
    cout << "请输入正整数 a:";
    cin >> a;
    int result = fibonacci(a);
    cout << "斐波那契数列中第 " << a << " 个数为:" << result << endl;
    return 0;
}

通过运行上述代码,我们可以输入一个正整数 a a a,然后计算并输出斐波那契数列中第 a a a 个数的值。

🌟 兔子问题

已知有一对兔子,每个月会繁殖一对新的小兔子,新的兔子第二个月会长成成年兔子,能继续进行繁殖。现在想知道过了 N N N 个月后,总共有多少对兔子?

对于兔子问题,我们以输入 N = 6 N=6 N=6 为例,展示推演过程:

月份第1个月第2个月第3个月第4个月第5个月第6个月
新生兔子111235
可以繁殖的兔子对数011235
总的兔子对数1224610

描述:

  1. 第一个月,只有一对兔子,属于新生兔子。
  2. 第二个月,还是只有一对兔子,属于可以繁殖的兔子对数。
  3. 第三个月,第一对兔子长大并开始繁殖,所以有一对新生兔子,仍然只有一对可以繁殖的兔子。
  4. 第四个月,第一对兔子继续繁殖,产生了一对新生兔子,第二对兔子长大并开始繁殖,所以有两对可以繁殖的兔子。
  5. 第五个月,第一对兔子和第二对兔子继续繁殖,每对兔子都产生了一对新生兔子,第三对兔子长大并开始繁殖,所以有三对可以繁殖的兔子。
  6. 第六个月,第一对兔子、第二对兔子和第三对兔子继续繁殖,每对兔子都产生了一对新生兔子,第四对兔子长大并开始繁殖,所以有五对可以繁殖的兔子。

由此可以推得, f ( n ) = f ( n − 1 ) + f ( n − 2 ) f(n)=f(n-1)+f(n-2) f(n)=f(n1)+f(n2),问题转换为求斐波那契数列问题,每个月的兔子总数等于前一个月的兔子总数加上两个月前的成年兔子总数。

下面是使用递推算法计算兔子数量的代码:

#include <iostream>
using namespace std;

int rabbit(int n) {
    if (n == 1 || n == 2) {
        return 1;
    }
    int prev1 = 1;  // n-1 个月的兔子数量
    int prev2 = 1;  // n-2 个月的兔子数量
    int curr = 2;  // n 个月的兔子数量
    for (int i = 3; i <= n; i++) {
        curr = prev1 + prev2;
        prev2 = prev1;
        prev1 = curr;
    }
    return curr;
}

int main() {
    int N;
    cout << "请输入经过的月份数 N:";
    cin >> N;
    int result = rabbit(N);
    cout << "经过 " << N << " 个月后,总共有 " << result << " 对兔子" << endl;
    return 0;
}

通过运行上述代码,我们可以输入经过的月份数 N N N,然后计算并输出经过 N N N 个月后,兔子的总对数。

📖 总结

递推算法是一种基于已知条件和规则的算法思想,通过利用前面计算的结果来推导出后续的结果。它可以将复杂的问题拆解成简单的子问题,并使用递推规则来解决这些子问题,最终得到问题的解。

在本节中,我们介绍了递推算法的概念和应用,并通过斐波那契数列和兔子问题的例子进行了练习。通过这些例子,我们了解了递推算法的运作原理和实际应用,并学会了使用递推算法解决问题。

🎉 至此,我们完成了本节的学习。继续加油,掌握更多的算法知识!

⭐️希望本篇文章对你有所帮助。

⭐️如果你有任何问题或疑惑,请随时向提问。

⭐️感谢阅读!

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

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

相关文章

IM即时通讯APP在聊天场景中的应用

即时通讯&#xff08;IM&#xff09;应用可以满足人们随时随地进行文字、语音、图片、视频等多媒体信息的传递需求&#xff0c;为个人和企业提供了高效、便捷的沟通方式。在企业中&#xff0c;IM即时通讯APP更是发挥着重要的作用&#xff0c;促进了协作和团队工作的效率提升。以…

jenkins邮箱设置报:501 mail from address must be same as authorization user

jenkins配置邮箱时遇到如下错误&#xff1a;501 mail from address must be same as authorization user 原因是管理员邮箱地址与发送邮箱地址不统一&#xff0c;配置管理员邮件地址&#xff1a;系统管理-系统配置-Jenkins Location&#xff0c;输入与发件人统一的地址即可

Airtest:Windows桌面应用自动化测试三【Airtest脚本的点击位置与点击偏移】

Airtest脚本的点击位置与点击偏移 1. 前言2. Airtest的点击位置3.Airtest的点击偏移图像点击偏移&#xff0c;常用于下述场景中&#xff1a;3.1、一个是&#xff0c;当我们的页面中&#xff0c;存在很多个相同的图标&#xff0c;我们想指定点击某个位置的图标&#xff0c;就有可…

台灯的功能作用有哪些?分享好用的台灯

照明对于我们来说是非常重要的&#xff0c;从远古时期的钻木取火到古代的蜡烛、油灯以及近代电灯&#xff0c;可以说人们在不断的创造着能够发亮的东西&#xff0c;而现在电灯的种类很多&#xff0c;包括壁灯、吊灯、台灯等&#xff0c;因为实际用到的环境不同起到的作用也不尽…

抖音矩阵号/抖音短视频SEO矩阵系统源码开发及开发者思路分享....

抖音矩阵号短视频系统&#xff0c;抖音矩阵号系统源码开发,思路分享&#xff0c;说一点开发者掏心窝子的话...... 一套优秀的短视频获客系统&#xff0c;支持短视频智能剪辑、短视频定时发布&#xff0c;短视频排名查询及优化&#xff0c;短视频智能客服等&#xff0c;那么短视…

C语言进阶---动态内存管理

1、为什么存在动态内存分配&#xff1f; 我们已经掌握的内存开辟方式有&#xff1a; int a 20; //在栈空间上开辟四个字节。 char arr[20]; //在栈空间上开辟10个字节的连续空间。但是上述的开辟空间的方式有两个特点&#xff1a; 开辟空间大小是固定的数组在申…

基于JSP+Servlet+Mysql客户管理系统

基于JSPServletMysql客户管理系统 一、系统介绍二、功能展示1.项目骨架2.登录界面3.个人信息修改4.数据分析5.市场管理6.线索管理7、联系人8、客户管理9、交易管理 四、其它1.其他系统实现五.获取源码 一、系统介绍 项目类型&#xff1a;Java web项目 项目名称&#xff1a;基…

【弱网】clumsy的filter语法设置

clumsy 官方说明 jagt WinDivert 的语法 https://github.com/basil00/Divert/wiki/WinDivert-Documentation#7-filter-languageDivert大神们的改版 clumsy-regoutbound 发送 inbound

CVPR2023 Openlanev2 挑战赛:第一名方案解读

引言: 如第一篇挑战赛的博客(# CVPR2023挑战赛之-开放车道拓扑信息(OpenLane Topology)的测试【1】)所说,这项任务,实际上是一个复合任务,其评价指标也是语义分割、目标检测加拓扑位置关系三个指标的精准性平均值。本博客就第一名公布的Arxiv方法进行了解读,并对topol…

iview input组件clearable清空属性无法清空双向绑定值的原因解决

最近在使用iview新版本 input组件时&#xff0c;刚开始发现使用v-modal绑定的值&#xff0c;在点击clearable清除input框内容时&#xff0c;再次搜索发现参数还是没有被清掉 于是仔细查看代码的细节&#xff0c;才发现问题所在&#xff1a; 原来我绑定的参数的中文名称&#x…

【C1】数据类型,运算符/循环,数组/指针,结构体,main参数,static/extern,编译预处理,gdb,makefile

文章目录 1.数据类型&#xff1a;编译器&#xff08;compiler&#xff09;与解释器&#xff08;interpreter&#xff09;&#xff0c;中文里的汉字和标点符号是两个字节&#xff0c;不能算一个字符&#xff08;单引号&#xff09;2.运算符/循环&#xff1a;sizeof/size_t3.数组…

SQL中的——左连接(Left join)、右连接(Right join)、内连接(Inner join)

前言 最近有一个开发需求&#xff0c;需要实现一个复杂年度报表&#xff0c;前后端都是博主开发&#xff0c;这里的业务逻辑比较复杂&#xff0c;也很锻炼sql能力&#xff0c;这里博主也将表的内外连接做了一个整理分享给大家 一、概念 首先还是介绍一下这三个的定义 1.Lef…

C#难点语法讲解之abstract---从应用需求开始讲解

一、背景故事 我们正常写的脚本&#xff0c;一般都是非常完整的&#xff0c;脚本完整意味着需求完整。 例如&#xff0c;我是售货员&#xff0c;现在苹果5元&#xff0c;梨子3元&#xff0c;西瓜20元&#xff0c; 一个人&#xff0c;来买了5个苹果&#xff0c;4个梨子&#xf…

springcloud二回头

Spring Cloud 一种微服务&#xff0c;以往的单体项目在一定程度的累积后&#xff0c;一些服务需要进行拆分&#xff0c;独立进行开发&#xff0c;然后再合起来&#xff0c;之前的是装成一个包进行部署 不同的搭配&#xff1a; spring cloud和boot的对应版本&#xff1a; Rest…

JavaScript 内置对象 数据类型

目录 JavaScript 内置对象 1.内置对象 2.查文档 2.1MDN 2.2 如何学习对象中的方法 3.Math对象 3.1Math 概述 3.2随机数方法 random() 4. 日期对象 4.1Date 概述 4.2Date() 方法的使用 4.3 日期格式化 4.4获取毫秒的总的毫秒形式 5.数组对象 5.1数组对象的创建 5…

1. Netty核心功能与线程模型详解

Netty 1. 认识Netty2. 第一个Netty程序 本文是按照自己的理解进行笔记总结&#xff0c;如有不正确的地方&#xff0c;还望大佬多多指点纠正&#xff0c;勿喷。 课程内容&#xff1a; 01、Netty核心组件快速了解 02、Hello,Netty! 03、深入理解Channel、EventLoop(Group) 04、深…

MySql的使用

目录 一、安装与启动1.1 Ubuntu下的使用1.2 Mac下的使用 二、MySQL图形化管理工具的使用三、数据完整性3.1 数据类型3.2 约束 四、常用的sql语句4.1 数据库操作4.2 数据库表操作1.查看当前数据库中所有表2.查看建表的数据结构3.创建表4.添加字段5.修改字段6. 删除字段7. 查看表…

nodejs之net模块的使用

vscode的底层ipc通讯都是基于node的net模块进行封装&#xff0c;今天大概讲解下net模块的使用 官方文档地址&#xff1a;https://nodejs.cn/api/net.html net模块的作用 net模块提供了基于流的方式构建tcp或ipc服务器和客户端的能力。 node:net 模块提供异步网络 API&#x…

ChatGPT发展与技术基础

一、ChatGPT发展 【ChatGPT——GPT3.5】 诞生于&#xff1a;2022 年 11 月 类型&#xff1a;对话场景的大语言模型 特点&#xff1a;更贴近人的方式与使用者互动&#xff1b;在理解人类意图、精准回答问题、流畅生成结果方面远超人类预期。 功能&#xff1a;可以回答问题、…

bug--两个表格,数据来自于同一个抽屉表格,现在让两个表格的数据 不能一样--处理checked 和 disabled

步骤一、拿到表格数据 步骤二、处理 checked&#xff0c;要区分是A表 还是B表&#xff0c;这个区分要在 A表、B表 数据展示的组件里&#xff08;根源&#xff09;区分 &#xff1a; 点击A表&#xff0c;抽屉表格中A 已选的状态 是 checked 且 disabled&#xff0c;B 已选的 抽…