递推算法介绍

news2024/11/15 11:07:29

递推算法

给定一个数的序列H0,H1,…,Hn,…若存在整数n0,使当n>n0时,可以用等号(或大于号、小于号)将Hn与其前面的某些项Hi(0<i<n)联系起来,这样的式子就叫做递推关系。

递推算法是一种简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法。 递推算法分为顺推和逆推两种。

相对于递归算法,递推算法免除了数据进出栈的过程,也就是说,不需要函数不断的向边界值靠拢,而直接从边界出发,直到求出函数值. 比如阶乘函数:f(n)=n*f(n-1) 在f(3)的运算过程中,递归的数据流动过程如下: f(3){f(i)=f(i-1)*i}-->f(2)-->f(1)-->f(0){f(0)=1}-->f(1)-->f(2)--f(3){f(3)=6} 而递推如下: f(0)-->f(1)-->f(2)-->f(3) 由此可见,递推的效率要高一些,在可能的情况下应尽量使用递推.但是递归作为比较基础的算法,它的作用不能忽视.所以,在把握这两种算法的时候应该特别注意。

顺推法

所谓顺推法是从已知条件出发,逐步推算出要解决的问题的方法叫顺推。 如斐波拉契数列,设它的函数为f(n),已知f(1)=1,f(2)=1;f(n)=f(n-2)+f(n-1)(n>=3,n∈N)。则我们通过顺推可以知道,f(3)=f(1)+f(2)=2,f(4)=f(2)+f(3)=3……直至我们要求的解。

逆推法

所谓逆推法从已知问题的结果出发,用迭代表达式逐步推算出问题的开始的条件,即顺推法的逆过程,称为逆推。

递推算法的经典例子

【案例】从原点出发,一步只能向右走、向上走或向左走。恰好走N步且不经过已走的点共有多少种走法?

样例输入:N=2

样例输出:result=7

样例输入:N=3

样例输出:result=17

解题思路:要解决走N步共有多少种走法,我们在拿到题目的时候最直接的想法就是先画出当N=1、N=2、N=3。。。。。N=n时对应走法的图例,由简单到复杂、由特殊到一般的推理过程,找出规律获得解题的思路。在数学上,我们称为归纳法。如果用编程的方法来求解这样的推理题,我们把这样的求解思路(算法)称之为递推法。递推的精髓在于f(n)的结果一般由f(n-1)、f(n-2)…..f(n-k)的前k次结果推导出来。我们在解决这类递推问题时,难点就是如何从简单而特殊的案例,找到问题的一般规律,写出f(n)与f(n-1)、f(n-2)…..f(n-k)之间的关系表达式,从而得出求解的结果。在历年noip的复赛当中,参赛选手对于这类题目都有这样的感受,往往花费了大量的时间来分析题目的一般规律,写出f(n)的一般表达式,而编程实现可能只需要几分钟的时间。所以我们在平时训练的时候,对于这样的递推题目,就必须掌握如何分析问题,从特殊推导出一般的规律,写出想要的关系表达式,问题就迎刃而解了。下面是这道题解题的心得,供大家参考:

(1)当N=1时,绘出走法图

(图1)共有3种不同的走法,也就是黑色线条的数量,即f(1)=3

(2)当N=2时,绘出走法图

(图2)共有7种不同的走法,也就是绿色线条的数量,即f(2)=7

(3)当N=3时,绘出走法图

(图3)共有17种不同的走法,也就是红色线条的数量,即f(3)=17

由此,我们不难看出,对于任何一个起点,最多可以走出3种走法,但最少必须走出2种走法。那么我们要求出f(n),实际上转换为如果我们能够得到上一步即f(n-1)有多少个终点是有3种走法的,有多少个点有2种走法的,那么问题就解决了。

a. 上一步,即f(n-1)有多少个终点是有3种走法的。

       对于N=3时,f(n-1)=f(2), 有3个点A、B、C可以走出3种不同走法的,这3个点是怎么得到的呢?它的存在与N值有没有必然的联系?如果我们能找到它与N之间的关系,问题也就解决了。有了这样的思路以后,我们不难找到这样的规律:如果f(n-2)存在,即上上步存在,那么从上上步出发的线路里面必然会有一条向上走的线路,而这条向上走的线路在到达f(n-1)之后,  向f(n)出发时也必然有左、上、右这三种走法,那么我们就得出了这样的结论:当f(n-2)存在时,f(n-2)的值实际上就等价于f(n-1)有多少个终点是有3种走法。

         b.    f(n-1)有多少个终点是有2种走法的

对于N=3时,有4个点D、E、F、G可以走出2种不同走法的,这4个点又是怎么得到的呢?它与N值有什么联系呢? 实际上我们在解决了上一个问题的时候,这个问题就变得相当容易了, f(n-1)减掉刚才有3种走法的点,剩下的点不就是只有2种走法了吗?即f(n-1)-f(n-2)。

    c. 得出f(n)的一般关系式

f(n)=3*f(n-2)+2*(f(n-1)-f(n-2) ) (n>=3)

化简:

f(n)=2*f(n-1)+f(n-2) (n>=3)

      有一点需要补充的就是,任何递推题,都会有临界条件。当N=1时,f(n)=3;,当N=2时,f(n)=7,这些都可以看成是临界条件。只有当N>=3时,即上上步存在的情况下,就可以得出f(n)的一般通式:f(n)=2*f(n-1)+f(n-2)

          (本题还有其他的解法,同学们可以继续挖掘!)

【参考程序】

#include <stdio.h>   
#include <windows.h>    
int main()    
{    
   int n;    
   int i;    
   int fn_1,fn_2;    
   printf("please input n=");    
   scanf("%d",&n); //输入任意n值    
   int fn=0;    
   if(n==1)    
     fn=3; //初始化当n=1和n=2时的临界条件    
   else if(n==2)    
     fn=7;    
   else{    
     fn_1=7;    
     fn_2=3;    
     for(i=3;i<=n;i++)    
     {    
        fn=2*fn_1+fn_2; //当n>=3时fn的通式    
        fn_2=fn_1;//更新fn_1和fn_2的值    
        fn_1=fn;    
     }    
   }    
   printf("一共有%d种走法!\n",fn);  //输出结果    
   return 0;    
}

复制

java递归算法分析

递归算法分析:就是把复杂的问题分解为若干个相对简单的子问题,一直分解下去,直到子问题有答案为止,也就是说到了递推的出口。 递归算法要注意的两点:       (1) 递归就是在方法里调用自己;       (2) 在使用递归算法时,必须要有一个明确的递归结束条件,称为递归出口。 先看一个简单的例子,求从1加到5的和,代码如下:

package com.juziku;

/**
* 递归测试
* @author sunlightcs
* 2011-3-9
* http://hi.juziku.com/sunlightcs/
*/
public class RecursionTest {
    
    /**
     * 求从1加到n的和
     */
    public static int sum(int n){
        if(n == 1){
            return 1;
        }else{
            return n + sum(n-1);
        }
    }
    
    
    public static void main(String[] args) {
        System.out.println(sum(5));
    }
}

复制

先分析一下执行的流程: n=5时,执行sum(5)方法,返回的结果为:5 + sum(4) n=4时,执行sum(4)方法,返回的结果为:4 + sum(3) n=3时,执行sum(3)方法,返回的结果为:3 + sum(2) n=2时,执行sum(2)方法,返回的结果为:2 + sum(1) n=1时,执行sum(1)方法,返回的结果为:1 再向上返回,依次执行: 2+1 3+(2+1) 4+(3+2+1) 5+(4+3+2+1) = 15 思路应该是这样的: 要知道从1加到5的和,先得知道从1加到4的和,即:5+sum(4) 要知道从1加到4的和,先得知道从1加到3的和,即:4+sum(3) 要知道从1加到3的和,先得知道从1加到2的和,即:3+sum(2) 要知道从1加到2的和,先得知道从1加到1的和,即:2+sum(1) 从而很容易看出,递归的出口为1也就是sum(1)的值为1 再看一个例子,求5的阶乘,代码如下:

package com.juziku;

/**
* 递归测试
* @author sunlightcs
* 2011-3-8
* http://hi.juziku.com/sunlightcs/
*/
public class RecursionTest {

    /**
     * 求n的阶乘
     */
    public static int multiply(int n) {
        if(n == 1){
            return 1;
        }else{
            return n * multiply(n - 1);
        }
    }
    
    
    public static void main(String[] args) {
        System.out.println(multiply(5));
    }
}

复制

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

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

相关文章

CVPR 2023|EfficientViT:让ViT更高效部署实现实时推理(附源码)

点击蓝字 关注我们 关注并星标 从此不迷路 计算机视觉研究院 公众号ID&#xff5c;计算机视觉研究院 学习群&#xff5c;扫码在主页获取加入方式 论文地址&#xff1a;https://arxiv.org/pdf/2305.07027.pdf 项目代码&#xff1a;https://github.com/microsoft/Cream/tree/main…

打通B端企业私域运营体系:海康威视企业公众号矩阵一探究竟

B端企业私域运营体系的打造需要全新的思路和流程重构&#xff0c;要紧紧围绕B端客户的需求和特性来构建矩阵号&#xff0c;而且要时刻意识到与C端私域运营的巨大差异。 B端企业的获客是一个大部分企业都十分关注但难以提升的部分&#xff0c;传统B端企业的营销以百度等在线渠道…

candence:常见表贴焊盘绘制举例

常见表贴焊盘绘制举例 一、先来看看X7R电容的相关信息 以贴装瓷片电容X7R系列为例 1、误差范围&#xff1a; 2、尺寸大小 3、推荐焊盘尺寸 二、绘制 0603 (inch) 电容的焊盘 下面开始绘制焊盘&#xff1a; 1、 双击打开Pad Designer 2、设置单位等。 3、 点击"LAYER&…

GeSciLiVis | 想知道你感兴趣的基因有多少人在研究吗!?用这个包来解决吧!!!~

1写在前面 天气好热啊&#xff0c;我这里还下着大暴雨&#xff01;~&#x1f625; 不知道各位小伙伴那里的温度怎么样&#xff0c;端午临近&#xff0c;各位有假期吗&#xff01;&#xff1f;&#x1f618; 换组后工作轻松了不少&#xff0c;也有时间做点自己的事情了。&#x…

JDK8-2-流(2.1)- 流操作-distinct

JDK8-2-流&#xff08;2.1&#xff09;- 流操作-distinct 去重操作&#xff0c;如下开头两个菜品一样&#xff0c;对 menu 去重如下&#xff1a; public class DishDistinctTest1 {public static final List<Dish> menu Arrays.asList(new Dish("pork", fal…

如何白嫖一年CSDN会员?618活动!亲测有效!!!

活动详情 CSDN会员免费送一年&#xff0c;仅剩3天&#xff01; 下载权益同样延长一年&#xff01; 一年一次的机会&#xff0c;走过不要错过&#xff01; 博主已经领取到了&#xff01; 会员权益 1、修改专属域名&#xff0c;别人都是https://blog.csdn.net/qq_xxxxxxxx&…

用ipad2022款pro平板和平精英吃鸡120帧是种什么体验

用ipad2022款pro平板和平精英吃鸡120帧是种什么体验&#xff0c;平板玩游戏把把吃鸡的秘密#和平精英 #吃鸡 #我眼中的电子竞技 和平精英 微信游戏 怎么很多小伙伴都准备入手二款的 iPad Pro&#xff0c;绝大多数小伙伴都是冲着这个吃鸡来的&#xff0c;咱们今天就看一下新款平…

AI绘图新玩法「艺术风二维码」保姆级教程分享,注册账号就能玩,一分钟出图,定制自己的二维码!

大家好&#xff0c;我是卷了又没卷&#xff0c;薛定谔的卷的AI算法工程师「陈城南」~ 担任某大厂的算法工程师&#xff0c;带来最新的前沿AI知识和工具&#xff0c;包括AI相关技术、ChatGPT、AI绘图等&#xff0c;欢迎大家交流~。 最近AI绘图界又出了一个现象级的玩法&#xf…

FPGA基础知识-开关级建模

目录 学习目标 学习内容 1.MOS开关 2.CMOS开关 3.双向开关 4.电源和地 5.阻抗开关 6.开关中的延迟说明 学习时间 学习总结 学习目标&#xff1a; 提示&#xff1a;这里可以添加学习目标 1.能够描述基本 MOS开关:nmos.pmos和cmos。 2.理解双向传输开关、电源和地的建…

webpack配置preload和prefetch预加载技术

我们前面已经做了代码分割&#xff0c;同时会使用 import 动态导入语法来进行代码按需加载&#xff08;我们也叫懒加载&#xff0c;比如路由懒加载就是这样实现的&#xff09;。 但是加载速度还不够好&#xff0c;比如&#xff1a;是用户点击按钮时才加载这个资源的&#xff0…

【第二次】21级计科计算机组成原理课外练习

【第二次】21级计科计算机组成原理课外练习 一、单选题二、填空题 一、单选题 2-1 设计算机字长 8位&#xff0c;设x -10, [x]补 为 ( ) A.F0H B.E6H C.FAH D.F6H 2-2 对字长为8位的二进制代码10110110&#xff0c;下列说法错误的是&#xff08;&#xff09;。 A.如果代码为…

主流通信协议详解、二进制协议和文本协议的区别和使用场景

二进制协议和文本协议的特征和使用场景 二进制协议和文本协议具有不同的特征和适用场景&#xff1a; 二进制协议的特征&#xff1a; 数据表示&#xff1a;使用二进制编码来表示数据&#xff0c;以字节为单位进行传输。效率&#xff1a;由于数据以原始二进制形式传输&#xff…

年龄越来越大,技术人究竟该往哪个方向提升?(很多人都有这个困惑)

【1】 有位匿名朋友&#xff0c;在星球中提问&#xff1a; 想咨询一下沟通交流能力应该如何培养。平时遇到问题话到嘴边不会说&#xff0c;或者说出来的和开始想的不一致&#xff0c;请沈总赐教。 分享下自己的实践&#xff1a; 首先&#xff0c;充分准备。 我在和老板&#xf…

Linux ACL访问控制

文章目录 1、场景2、ACL权限设置1) ACL权限管理命令2) 给用户和用户组添加ACL权限3) 最大有效权限mask4) 默认ACL权限和递归ACL权限5) 删除ACL权限 1、场景 在普通权限中&#xff0c;用户对文件只有三种身份&#xff0c;就是属主、属组和其他人&#xff1b;每种用户身份拥有读…

实验篇(7.2) 14. 站对站安全隧道 - 多条隧道冗余(FortiGate-IPsec) ❀ 远程访问

【简介】IPsec VPN虽然价廉物美&#xff0c;但是由运营商原因&#xff0c;偶尔出现不稳定情况&#xff0c;例如访问慢甚至断开等&#xff0c;好在现在大多数企业都有二条甚至更多条宽带&#xff0c;我们可以创建多条IPsec VPN&#xff0c;来保证不间断访问。 实验要求与环境 Ol…

线性搜索算法-数据结构和算法教程

线性搜索被定义为一种顺序搜索算法&#xff0c;它从一端开始&#xff0c;遍历列表的每个元素&#xff0c;直到找到所需的元素&#xff0c;否则搜索继续到数据集的末尾。 线性搜索算法是如何工作的&#xff1f; 在线性搜索算法中&#xff0c; 每个元素都被认为是键的潜在匹配…

回归预测 | MATLAB实现基于QPSO-LSTM、PSO-LSTM、LSTM多输入单输出回归预测

回归预测 | MATLAB实现基于QPSO-LSTM、PSO-LSTM、LSTM多输入单输出回归预测 目录 回归预测 | MATLAB实现基于QPSO-LSTM、PSO-LSTM、LSTM多输入单输出回归预测效果一览基本描述模型描述程序设计参考资料 效果一览 基本描述 1.Matlab实现QPSO-LSTM、PSO-LSTM和LSTM神经网络时间序…

事件循环(字数不足凑字)

浏览器的进程模型 何为进程&#xff1f; 程序运行需要有它自己专属的内存空间&#xff0c;可以把这块内存空间简单的理解为进程。 每个应用至少有一个进程&#xff0c;进程之间相互独立&#xff0c;即使要通信&#xff0c;也需要双方同意。 即使崩溃也互不影响。 何为线程&…

12. python从入门到精通——文件及目录操作

目录 基本文件操作 创建和打开文件&#xff1a;open()函数 关闭文件:可以不关闭文件因为有垃圾回收功能 打开文件时使用with语句:不需要自己关闭文件&#xff0c;可以自己关闭 写入文件内容 file.write方法 file.writelines方法:可以向文件中写入字符串列表&#xff0c;…

MyBatis插件开发——解析和记录输出完整的SQL语句

实现功能 自定义MyBatis插件&#xff0c;该插件实现当MyBatis执行SQL发生异常时输出错误原因&#xff0c;SQL参数以及完整的SQL语句。在日常的开发中我们可以通过mybatis配置设置是否输出SQL&#xff0c;但是对于正常运行的SQL全部输出出来日志量过大&#xff0c;所以这里实现…