你站在桥上看风景看风景的人在楼上看你明月装饰了你的窗子你装饰了别人的梦——卞之琳

递推算法的特点

一个问题的求解需要大量重复计算,在已知的条件和所求问题之间总存在着某种相互联系的关系,在计算时,我们需要找到这种关系,进行计算(递推关系式)。

即递推法的关键,就是找到递推关系式,这种处理方式能够将复杂的计算过程,转化为若干步骤的简单重复运送,充分利用计算机运行程序时的时间局部性和空间局部性。

递推算法的思想:

  1. 首要问题是先找到各个相邻数据项之间的递推关系;
  2. 递推关系避开了求通项公式的麻烦,且有些题目的通项公式很难求,或者不能进行求解;
  3. 将复杂问题分解为若干步骤的简单运算;
  4. 一般来说递推算法就是一种特殊的迭代算法。

递推算法解题的基本思路:

  1. 将复杂计算转换为简单重复运算;
  2. 通过找到递推关系式进行简化运算;
  3. 利用计算机的特性,减少运行时间。

递推算法的一般步骤:

  1. 根据题目确定数据项,并找到符合要求的递推关系式;
  2. 根据递推关系式设计递推程序;
  3. 根据题目找到递推的终点;
  4. 单次查询可以不进行存储,多次查询都要进行存储;
  5. 按要求输出答案即可。

递归算法:

递归算法是一种从自顶向下的算法,实际上是通过不停的直接调用或者间接的调用自身的函数,通过每次改变变量完成多个过程的重复计算,直到到达边界之后,结束调用。

与递推法相似的是,递归与递推都是将一个复杂过程分解为几个简单重复步骤进行计算。

递归算法的实现的核心是分治策略,即分而治之,将复杂过程分解为规模较小的同类问题,通过解决若干个小问题,进而解决整个复杂问题。

递归算法的思想:

  1. 将复杂计算过程转换为简单重复子过程;
  2. 找到递归公式,即能够将大问题转化为小问题的公式;
  3. 自上而下计算,在返回完成递归过程。

递归算法设计的一般步骤:

  1. 根据题目设计递归函数中的运算部分;
  2. 根据题目找到递归公式,题目可能会隐含给出,也可能需要自己进行推导;
  3. 找到递归出口,即递归的终止条件。

递归法的和递推法的思路也给大家讲的差不多了,我们结合真实大赛题目给大家进行讲解。

题目08 斐波那契数列

在一定情况下,同一个问题可以使用用递归也可以使用递推解答。一般一个问题的递推关系和递归关系都好求的话就都可以解题。

当然如果题目只有一个关系好求,那就最好采用关系好求的办法。

题目描述:

斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”。指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)请求出该数列中第n个数字(n从1开始计数)是多少。

样例:

输入样例样例1输入
6样例2输入
4输出样例样例1输出
8样例2输出
3

对于上面的样例我们进行了如下计算;

[0]=0[1]=1[2]=0+1[3]=1+1=2[4]=1+2=3[5]=2+3=5[6]=5+3=8

运行限制:

1. 最大运行时间:1s
2. 最大运行内存:128M

递归算法的通用框架如下:

do(a,b,c...)
{//递归终止条件,即出口if(a==? ,b==? ,....) return //递归条件if(条件1)do(参数1)else(条件2)do(参数2)}如本题,各子式间存在计算关系,可以化为:do(a)
{if(a==0) return 0;if(a==1) return 1;return do(a-1)+do(a-2);
}

代码:

import java.util.Scanner;public class _08斐波那契数列 {public static void main(String[] args) {}// 递推static void f1() {int n; //第几个数int x=0; //F(n)int y=1; //F(n+1)int ans = 0; //F(n+2)Scanner in = new Scanner(System.in);n = in.nextInt();if(n==0) ans=0;else if(n==1) ans=1;else {for(int i=2;i<=n;i++){ans=x+y;x=y;y=ans;}}System.out.println(ans);}// 递归static void f2() {int n; //第几个数int ans = 0;Scanner in = new Scanner(System.in);n = in.nextInt();ans=fn(n);System.out.println(ans);}static  int fn(int n){if(n==0)return 0;//递归出口2else if(n==1 )return 1;elsereturn fn(n-1)+fn(n-2); //递归关系式}}

存储版递归和递推:

public class Main {static int []F=new int [35];static  void init() {F[0]=0;F[1]=1;for(int i=2;i<=30;i++) {F[i]=F[i-1]+F[i-2];}}public static void main(String[] args) {int m; //m次查询int n; //第几个数init();Scanner in = new Scanner(System.in);m = in.nextInt();while(m>0){m-=1;n= in.nextInt();System.out.println(F[n]);}}
}
public class Main {static int []F=new int [35];static int fn(int n){//递归出口1if(n==0) {F[0]=0;return 0;}//递归出口2else if(n==1 ) {F[1]=1;return 1;} else {F[n]=fn(n-1)+fn(n-2);return F[n]; //递归关系式}}public static void main(String[] args) {int m; //m次查询int n; //第几个数fn(30);Scanner in = new Scanner(System.in);m = in.nextInt();while(m>0){m-=1;n= in.nextInt();System.out.println(F[n]);}}
}

题目09 数字三角形

题目描述:

如图数字三角形。如下所示为一个数字三角形。请编一个程序计算从顶到底的某处的一条路径,使该路径所经过的数字总和最大。只要求输出总和。1. 一步可沿左斜线向下或右斜线向下走;
2. 三角形行数小于等于 100;
3. 三角形中的数字为 0,1,…,99;测试数据通过键盘逐行输入。如上例数据应以样例所示格式输入:

样例:

输入:5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出:30

运行限制:

1. 最大运行时间:1s
2. 最大运行内存:128M

代码:

import java.util.Scanner;public class _09数字三角形 {static int [][]a=new int [101][101];public static void main(String[] args) {int n;Scanner in = new Scanner(System.in);n = in.nextInt();//输入数字三角形的值for (int i=1; i<=n; i++) {for (int j=1; j<=i; j++) {a[i][j]=in.nextInt(); //输入原始数据}}//递推开始for (int i=n-1; i>=1; i--) {//从最后一层逆推for (int j=1; j<=i; j++) {a[i][j] += Math.max(a[i + 1][j], a[i + 1][j + 1]);     //路径选择}}System.out.println(a[1][1]);}
}

笔记来源:蓝桥杯省赛冲刺课程

算法笔记方法论3 递推法与递归法相关推荐

  1. 递推法与递归法2022.3.14

    递推法与递归法2022.3.14 递推法是用于数值求解的一个重要算法. 存储型的递归和递推: 存储就加个数组就好了吧. 三角形递推,先赋好值然后从后往前递推.甚至都不需要额外的空间,最后返回a[1][ ...

  2. Bailian1664 Placing apples【递推+记忆化递归】

    1664:Placing apples 总时间限制: 1000ms 内存限制: 65536kB 描述 We are going to place M same apples into N same p ...

  3. 常见算法思想2:递推法

    递推法 递推算法犹如稳重的有经验的老将,使用"稳扎稳打"的策略,不断利用已有的信息推导出新的东西. 在日常应用中有如下两种递推算法: (1)顺推法:从已知条件出发,逐步推算出要解决 ...

  4. 几个常见的简单的算法(暴力法,递推法,枚举法,递归法,分治法,贪心法,回溯法)

    最近在学习算法相关知识. 通过买的视频教程了解到了一些简单的算法,为了加深感悟,同时也为了理解,将这几个常见的算法的定义进行记录. 算法是程序的灵魂,也可以认为是程序最重要的部分. 在通过算法解决问题 ...

  5. 【学习笔记】线性递推数列

    1.11.11.1 定义:对于无限数列{a0,a1,a2,...}\{a_0,a_1,a_2,...\}{a0​,a1​,a2​,...}和有限非空数列{r0,r1,r2,...,rm−1}\{r_0 ...

  6. 【笔记】从递推式得到通项公式的几种方法

    开头瞎扯 数列这玩意在竞赛中考的不少,可以变形一些式子,所以做一个小总结 如果题目中出现了一个数列的式子,将其化为通项公式有可能可以快速求解或者是便于题目变形并发现题目性质 解题套路 对于大部分情况来 ...

  7. POJ1664 放苹果【递推+记忆化递归】

    放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 35209   Accepted: 21792 Description ...

  8. 求最大公约数的4种方法C语言(辗转相除法、辗转相减法、穷举法、递归法)

    最大公约数,也称最大公因数.最大公因子,指两个或多个整数共有约数中最大的一个. 目录 问题描述 辗转相除法(欧几里得算法) 代码实现 辗转相减法 代码实现 暴力穷举法 代码实现 递归法 代码实现 测试 ...

  9. 蓝桥杯 算法训练 ALGO-128 Cowboys 递推、动态规划

    算法训练 Cowboys 时间限制:2.0s 内存限制:256.0MB 提交此题 问题描述 一个间不容发的时刻:n个牛仔站立于一个环中,并且每个牛仔都用左轮手枪指着他旁边的人!每个牛仔指着他顺时针或者 ...

最新文章

  1. iOS UIButton(按钮)
  2. 小忆《记录博客一周年》
  3. 《剑指offer》-- 构建乘积数组、求1+2+3+...+n、不用加减乘除做加法、包含min函数的栈、用两个栈实现队列
  4. python define function的顺序_Python怎么根据一个函数来决定列表顺序
  5. CocoaPods安装及使用
  6. python爬虫利器p_Python:网络爬虫相当利器
  7. ubuntu下的jdk环境变量配置(解决sun jdk和open jdk的问题)
  8. wpf Content数据绑定StringFormat起作用的原理和解决(转)
  9. TCP/IP报文格式及通讯
  10. 软考网络工程师好考吗?怎么备考?
  11. 服务器带宽打开网页很慢,为什么网速很快,但打开的网页速度却很慢?
  12. 51单片机(十六)—— 定时器0和定时器1寄存器介绍及功能描述
  13. html的ul和li元素
  14. Iperf测试WIFI
  15. 华中科技大学计算机证书领取,华中科技大学计算机水平测试软考报名通知
  16. 杭州电子科技大学程序设计竞赛(2016’12)
  17. 【51单片机快速入门指南】4.2: SSD1306 OLED屏(0.96寸、1.3寸)的I2C控制详解
  18. IT经理的两条职业路做管理还是管理咨询
  19. 通用计算机中使用的内存条,如何选购电脑内存条?小白装机通俗易懂的电脑内存选购知识指南...
  20. Golang网络爬虫框架gocolly/colly(三)

热门文章

  1. 云安全 | 云原生应用程序保护平台 CNAPP
  2. python web三大框架对比_Python六大框架对比,Web2py略胜一筹
  3. [archlinux][crypto] 从T450迁移archlinux操作系统至T460s笔记本
  4. Win7纯手动深度优化系统
  5. 丹麦最神奇门将:踢球时思考数学,37岁拿诺奖,与爱因斯坦吵吵一辈子,开创了量子力学
  6. oracle账户注册和登录
  7. 交换机同时设置多个观察口,解决镜像口不足问题
  8. 概率统计·概率论的基本概念【条件概率】
  9. 树莓派安装ubuntu20.4及VNC配置
  10. 胆机实作(1)——12AU7甲类单端前级