算法——递推

news2024/11/22 15:22:04

目录

  • 前言
  • 一、什么是递推
  • 二、递推算法的分类
  • 三、递推算法的特点
  • 四、递推算法的应用
  • 五、递推算法的设计步骤
  • 六、递推算法与递归算法的比较
  • 七、经典例题
    • 1.斐波那契数列
      • 代码题解
    • 2.爬楼梯
      • 代码题解
    • [3.杨辉三角 II](https://leetcode.cn/problems/pascals-triangle-ii/submissions/559468904/)
      • 代码题解1
      • 代码题解2
  • 八、总结
  • 结语

前言

递推算法是必须掌握的一种基础算法,在一些比较出名的竞赛acm、蓝桥杯,并且在一些公司面试题中都可能会出现,而且作为简单题我们必须要拿下,所以我们要引起重视,下面让我们来深入了解递推。
在这里插入图片描述

一、什么是递推

递推算法(也称为递归算法或迭代算法,视具体实现而定)是一种通过已知信息逐步推导未知信息的算法设计技术。它通常用于解决那些可以分解为相似子问题的问题。递推算法的核心思想是利用已经计算出的结果来推导新的结果,从而避免重复计算,提高效率。

二、递推算法的分类

递推算法可以分为顺推和逆推两种:
顺推法:从已知条件出发,逐步推算出要解决的问题的方法。它通常用于求解序列的下一项或达到某个特定状态所需的步骤。例如,斐波那契数列的求解就可以使用顺推法。

逆推法:从已知问题的结果出发,用迭代表达式逐步推算出问题的初始条件。它是顺推法的逆过程,通常用于求解逆向问题或回溯问题。

三、递推算法的特点

高效性:递推算法避免了数据进出栈的过程,直接从边界出发,直到求出函数值。因此,相对于递归算法,递推算法通常具有更高的效率。

简单性:递推算法将复杂的计算过程转化为简单的重复步骤,使得算法易于理解和实现。

适用性:递推算法适用于求解具有递推关系的问题,如数列、动态规划等。

四、递推算法的应用

数列求解:递推算法在求解数列问题中具有重要作用。例如,斐波那契数列、等差数列、等比数列等都可以通过递推算法来求解。

动态规划:动态规划是一种解决最优化问题的算法思想,它通常使用递推关系来求解最优解。递推算法在动态规划中具有广泛的应用。

组合数学:递推算法在组合数学中也有重要作用。例如,求解排列、组合、概率等问题时,经常需要使用递推关系来简化计算。

五、递推算法的设计步骤

1.确定数据项:根据题目要求,确定需要求解的数据项。

2.找到递推关系式:通过分析题目,找到数据项之间的递推关系式。

3.设计递推程序:根据递推关系式,设计递推程序来求解问题。
找到递推的终点:确定递推过程的终点,即何时停止递推。

4.输出结果:按要求输出求解结果。

六、递推算法与递归算法的比较

实现方式:递推算法是从边界出发,逐步求解问题;而递归算法则是通过函数不断调用自身来求解问题。

效率:递推算法通常比递归算法更高效,因为它避免了数据进出栈的过程。

适用性:递推算法适用于求解具有明确递推关系的问题;而递归算法则更适用于求解具有递归性质的问题,如树的遍历、图的搜索等。

七、经典例题

1.斐波那契数列

(帅哥这个蓝色字体可以点进去看原题)

代码题解

class Solution {
public:
    int fib(int n) {
        int a[31];
        a[0]=0;
        a[1]=1;
        for(int i=2;i<=n;i++){
            a[i]=a[i-1]+a[i-2];
        }
        return a[n];
    }
};

2.爬楼梯

(帅哥这个蓝色字体可以点进去看原题)

代码题解

class Solution {
public:
    int climbStairs(int n) {
        int a[46];
        a[0]=1;//在第0阶就是1
        a[1]=1;//从第0阶上到1阶就只有一种方法,所以也是1
        for(int i=2;i<=n;i++){
            a[i]=a[i-1]+a[i-2];//爬到i阶楼梯等于前面两个方案数之和
        }
        return a[n];
    }
};

3.杨辉三角 II

代码题解1

class Solution {
public:
    vector<int> getRow(int rowIndex) {
        int a[34][34];
        a[0][0]=1;
        for(int i=0;i<=rowIndex;i++){
            for(int j=0;j<=i;j++){
                if(j==0||j==i) a[i][j]=1;//每一层首位元素都是1
                else a[i][j]=a[i-1][j]+a[i-1][j-1];
            }
        }
        vector<int> ret;
        for(int j=0;j<=rowIndex;j++){
            ret.push_back(a[rowIndex][j]);
        }
        return ret;
    }
};

代码题解2

class Solution {
public:
    vector<int> getRow(int rowIndex) {
        int a[2][34];
        int pre=0,now=1;//pre代表上一层,now代表这一层
        a[pre][0]=1;
        for(int i=1;i<=rowIndex;i++){
            for(int j=0;j<=i;j++){
                if(!j||j==i)a[now][j]=1;
                else a[now][j]=a[pre][j-1]+a[pre][j];
            }
            pre^=1;//pre与now的值互相转换,也就是0变为1,1变为0
            now^=1;
        }
        vector<int>ret;
        for(int i=0;i<=rowIndex;i++){
            ret.push_back(a[pre][i]);
        }
        return ret;
    }
};

八、总结

综上所述,递推算法是一种简单而高效的算法思想,在求解具有递推关系的问题中具有重要作用。在设计和实现递推算法时,需要仔细分析题目要求,找到正确的递推关系式,并设计合理的递推程序来求解问题。

结语

学习算法是一个很艰难,漫长的过程,我们要克服一切困难,学习算法本就是由易到难,不会的地方就问,我相信通过我们坚持不懈的努力一定能理解并熟练掌握其中细节,加油,我相信你一定能行。
在这里插入图片描述

关注我让我们一起学习编程,希望大家能点赞关注支持一下,让我有持续更新的动力,谢谢大家。
在这里插入图片描述

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

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

相关文章

C语言 | Leetcode C语言题解之第520题检测大写字母

题目&#xff1a; 题解&#xff1a; bool detectCapitalUse(char * word){int len strlen(word);int res 0;int index -1;if(len 1)return true;else{for(int i 0; i < len; i){if(isupper(word[i])){res;index i;}}}return res len || res 0 || (res 1 &&…

了解密钥推导函数KDF-HMAC-SHA-256

引言 在现代密码学中&#xff0c;密钥推导函数&#xff08;KDF&#xff0c;Key Derivation Functions&#xff09;扮演着至关重要的角色。它们允许从主密钥或密码生成一个或多个固定长度的密钥&#xff0c;用于各种加密操作。KDF的设计目标是确保从同一主密钥生成的多个密钥在统…

【LeetCode:153. 寻找旋转排序数组中的最小值 + 二分】

在这里插入代码片 &#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕…

Serverless + AI 让应用开发更简单

本文整理自 2024 云栖大会&#xff0c;阿里云智能高级技术专家&#xff0c;史明伟演讲议题《Serverless AI 让应用开发更简单》 随着云计算和人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;企业对于高效、灵活且成本效益高的解决方案的需求日益增长。本文旨在…

解决python matplotlib画图无法显示中文的问题

在用matplotlib做一个简单的可视化统计时&#xff0c;由于标签是中文&#xff0c;无法显示&#xff0c;只是显示出来一些方框&#xff08;如图&#xff09; 问题在于&#xff0c;当前matplotlib使用的字体不支持中文&#xff0c;我们进行替换就可以了 我想替换为黑体&#xff…

数据库_SQLite3

下载 1、更新软件源&#xff1a; sudo apt-get update 2、下载SQLite3&#xff1a; sudo apt-get install sqlite3 3、验证&#xff1a; sqlite3启动数据库&#xff0c;出现以下界面代表运行正常。输入 .exit 可以退出数据库 4、安装sqlite3的库 sudo apt-get install l…

砥砺十年风雨路,向新而行创新程丨怿星科技十周年庆典回顾

10月24日&#xff0c;是一年中的第256天&#xff0c;也是程序员节&#xff0c;同时也是怿星的生日。2014年到2024年&#xff0c;年华似水匆匆一瞥&#xff0c;多少岁月轻描淡写&#xff0c;怿星人欢聚一堂&#xff0c;共同为怿星科技的十周年庆生&#xff01; 01.回忆往昔&…

模拟电路week2

模拟电路学习 三.二极管 1.概念 本征半导体&#xff1a;纯净的半导体 本征半导体的晶体结构示意图&#xff1a; 载流子&#xff1a;在导体或半导体中能够移动并携带电荷的粒子 本征激发&#xff1a;在半导体中&#xff0c;当温度升高时&#xff0c;热能可以使价带中的电子跃…

10天进阶webpack---(1)为什么要有webpack

首先就是我们的代码是运行在浏览器上的&#xff0c;但是我们开发大多都是利用node进行开发的&#xff0c;在浏览器中并没有node提供的那些环境。这就早成了运行和开发上的不同步问题。 -----引言 浏览器模块化的问题&#xff1a; 效率问题&#xff1a;精细的模块划分带来了更…

【C++篇】跨越有限与无限的边界:STL之set容器中的自我秩序与无限可能

文章目录 C set 容器详解&#xff1a;秩序与高效的数据管理前言第一章&#xff1a;C set 的概念1.1 set 的定义1.2 set 的特点 第二章&#xff1a;set 的构造方法2.1 常见构造函数2.1.1 示例&#xff1a;不同构造方法 2.2 相关文档 第三章&#xff1a;set 的常用操作3.1 插入操…

Java求最值 C语言二维数组与指针

1. public static void main(String[] args) {int []arr{11,22,33,44,55,66};int maxarr[0];//arr[0]为索引值 若一开始为0&#xff1b;数组全是负数就会错误for (int i 1; i < arr.length; i) {if (arr[i]>max){maxarr[i];}}System.out.println(max); }//循环开始条件…

微服务设计模式 - 断路器模式 (Circuit Breaker Pattern)

微服务设计模式 - 断路器模式 (Circuit Breaker Pattern) 定义 断路器模式&#xff08;Circuit Breaker Pattern&#xff09;是云计算和微服务架构中的一种保护性设计模式&#xff0c;其目的是避免系统中的调用链出现故障时&#xff0c;导致系统瘫痪。通过断路器模式&#xff…

PG数据库 jsonb字段 模糊查询

背景&#xff1a; 项目由于多语言的设计&#xff0c;将字段设置成json字段类型&#xff0c;同时存储中文和英文 页面上通过输入框实现模糊的查询 一、表结构&#xff1a;name字段设置jsonb类型 二、表数据 3、Mybatis编写sql select pp.name ->>zh-CN as pmsProductNam…

OpenCV—calcHist()函数

void calcHist( const Mat* images, int nimages,const int* channels, InputArray mask,SparseMat& hist, int dims,const int* histSize, const float** ranges,bool uniform true, bool accumulate false ); images 输入的数据指针&#xff0c;要具备相同的尺寸和数…

《Python网络安全项目实战》项目2 Python基础练习

《Python网络安全项目实战》项目2 Python基础练习 项目2 Python基础练习任务2.1 使用数据类型2.1.1 输出2.1.2 输入2.1.3 数字2.1.4 字符串 相关知识 任务评价 任务拓展 任务2.2 使用组合数据类型2.2.1 列表2.2.2 元组2.2.3 集合2.2.4 字典 相关知识 任务评价 任务…

less解决function中return写法在浏览器被识别成Object导致样式失败的问题

问题描述&#xff1a; 一开始写的是: baseFontSize: 37.5px;//基于屏幕尺寸/10得出的基准font-size// return失败,浏览器显示为[object Object],[object Object] .pxToRem(px){value: px / baseFontSize * 1rem;return value; } 使用height: .pxToRem(40px);之后浏览器却是这…

安装中文版 Matlab R2022a

下载安装包 压缩包有点大&#xff0c;大概20G 百度网盘&#xff1a;下载链接 提取码&#xff1a;rmja 安装 解压后打开目录&#xff0c;右键以管理员身份运行 setup.exe 选择输入安装秘钥 输入秘钥&#xff1a; 50874-33247-14209-37962-45495-25133-28159-33348-18070-6088…

Linux云计算 |【第五阶段】CLOUD-DAY9

主要内容&#xff1a; Metrics资源利用率监控、存储卷管理&#xff08;临时卷ConfitMap、EmptyDir、持久卷HostPath、NFS(PV/PVC)&#xff09; 一、Metrics介绍 metrics是一个监控系统资源使用的插件&#xff0c;可以监控Node节点上的CPU、内存的使用率&#xff0c;或Pod对资…

sql数据库数据修改与删除-DML

目录 修改数据 同时修改两个数据 修改表中所有数据 删除数据 删除指定字段的值&#xff08;用UPDATE&#xff09; 删除整张表的数据 举例表如下FIRST表 修改数据 UPDATE 表名 SET 字段名1值1,字段名2值2,...[WHERE 条件]; 将first表name字段张三修改为张三丰。 UPDA…

Oracle视频基础1.3.5练习

Oracle视频基础1.3.4练习 1.3.5 检查数据库启动状态 ps -ef | grep oracle ipcs clear演示alter向前向后改database阶段 sqlplus /nolog conn / as sysdba startup mount alter database nomount # 报错 alter database open启动restricted mode&#xff0c;创建一个connect&…