目录

前言

上楼梯

机器人走方格


前言

接着上篇博客详解递归思想我们继续更深入地分析递归,本篇主要更加深入讲解上篇的自下而上和自上而下思想.

啥叫「自顶向下」?是从上向下延伸,都是从一个规模较大的原问题比如说 f(20),向下逐渐分解规模,直到 f(1) 和 f(2) 这两个 base case,然后逐层返回答案,这就叫「自顶向下」。

啥叫「自底向上」?反过来,我们直接从最底下、最简单、问题规模最小、已知结果的 f(1) 和 f(2)(base case)开始往上推,直到推到我们想要的答案 f(20)。这就是「递推」的思路,这也是动态规划一般都脱离了递归,而是由循环迭代完成计算的原因。

上楼梯

 思路:

 自上而下:递归,你会发现这个代码看起来很简单,不过很难理解,因为它是顺着想倒着写、

#define mod  1000000007;
typedef long long ll;
ll recursion(int n)
{if (n < 0)return 0;if (n == 0 || n == 1)return 1;if (n == 2)return 2;return recursion(n - 1) % mod + recursion(n - 2) % mod + recursion(n - 3) % mod;
}

自下而上:迭代,这个很好理解,它是顺着想顺着写 ,就是定义x1,x2,x3三个变量来记录各个台阶需要走的步数,并且及时更新;

#include<iostream>
using namespace std;
#define mod  1000000007;
typedef long long ll;
ll recursion(int n)
{if (n < 0)return 0;if (n == 0 || n == 1)return 1;if (n == 2)return 2;if (n == 3) return 4;int x1 = 1;int x2 = 2;int x3 = 4;for (int i = 4; i <= n; i++){int x_1 = x1;x1 = x2 % mod;x2 = x3 % mod;x3 = ((x1 + x2)% mod + x_1)% mod;}return x3;
}

例题练习:爬楼梯

机器人走方格

思路:

自上而下:递归 

int solvw(int x, int y)
{if (x == 1 || y == 1)return 1;//边界即推理的起点return solvw(x - 1, y) + solvw(x, y - 1);
}

自下而上:迭代 ;你会发现行数或者列数有一个为1时,不管你另一个取多少,都只有一种走法,边界即推理的起点;由二个分量来决定一个值的时候他就是个二维表结构。

代码:

public static int solve(int m, int n)
{int[][] state = new int[m + 1][n + 1];for (int i = 1; i <= n; i++){state[1][i] = 1;}for (int j = 1; j <= m; j++){state[j][1] = 1;}for (int i = 2; i <= m; i++){for (int j = 2; j <= n; j++){state[i][j] = state[i][j - 1] + state[i - 1][j];}}return state[m][n];}

<<算法很美>>——(四)——深入递归<一>——自上而下,自下而上相关推荐

  1. 【算法很美】深入递归 (下)深度优先搜索DFS问题

    深搜.回溯.剪枝 深度优先搜索DFS 2.1 无死角搜索I 数独游戏 部分和 水洼数目 2.2 回溯和剪枝 n皇后问题 素数环 困难的串 小结 一些使用 2.1 无死角搜索I 数独游戏 你一定听说过& ...

  2. 算法很美——数学问题

    算法很美--数学问题 题1:天平称重 问题描述: 用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量. 砝码重量分别是1,3,9,27,81--3的指数次幂,每种重量砝码只有一个 则它们可以 ...

  3. 算法很美-位运算-找出落单的那个数

    上级目录:算法很美 1. 题目 一个数组里除了某一个数字之外,其他的数字都出现了两次.请写程序找出这个只出现一次的数字. 2. 异或思路 异或的运算是A ^ A=0,也就是说偶数个相同的元素异或,结果 ...

  4. <<算法很美>>——(七)——DFS典题(二):数独游戏

    目录 问题描述 问题分析 放码过来: 问题描述 如[图1.png],玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一 行.每一列.每一个同色九宫内的数字均含1-9,不重复. 数 ...

  5. 蓝桥杯算法很美笔记—排序实现题

    题1:小白上楼梯(递归设计) 小白正在上楼梯,楼梯有n阶台阶,小白一次可以上1阶,2阶或者3阶,实现一个方法,计算小白有多少种走完楼梯的方式. 思路: 一次可以上1阶,2阶或者3阶,则最后一步可以为上 ...

  6. <<算法很美>>——(三)十大排序算法(上)

    目录 前言 冒泡排序 图解冒泡 代码实现 冒泡优化 选择排序 图解选排​ 代码实现 插入排序 图解插入 ​代码实现 希尔排序 图解希尔 ​代码实现: 归并排序 图解归并 ​代码实现 快速排序 图解快排 ...

  7. <<算法很美>>——(三)十大排序算法(下)

    目录 1. 奇数在左偶数在右 2. 最快效率求出乱序数组中第k小的数 3. 数组中有一个数字出现次数超过数组长度一半 4. 合并两个有序数组 5. 数组中的逆序对 6. 排序数组中两个数字之和 7. ...

  8. 蓝桥杯:算法很美 笔记 3.查找和排序(Python实现)

    1.分治法介绍以及关键点解析 分治法(divide and conquer, D&C)∶将原问题划分成若干个规模较小而结构与原问题一致的子问题﹔递归地解决这些子问题,然后再合并其结果,就得到原 ...

  9. <<算法很美>>——(七)——DFS典题(一):水洼数目

    目录 问题描述 问题分析 放码过来 问题描述 有一个大小为N×MN×M N\times MN×M的园子,雨后积起了水.八连通的积水被认为是连接在一起的.请求出园子里总共有多少水洼?八连通指的是下图中相 ...

最新文章

  1. vs2010 SQL Server Compact 3.5出错
  2. 资料收集新一代 Linux 文件系统 btrfs 简介
  3. AIX-maxuproc参数案例
  4. 2012自学CCNP路由与交换之四交换机初始化
  5. [译] 前端组件设计原则
  6. 前端学习(1050):todolist正在进行个数和已完成个数
  7. 最新!复旦大学邱锡鹏教授等「Transformers全面综述」论文
  8. 【Spring】Spring Eureka Client 注册报 registration status: 204
  9. 20200428:186周周赛下(leetcode1425)
  10. webhooks php,GitHub和WebHooks自动部署PHP项目
  11. ShiftViT用Swin Transformer的精度跑赢ResNet的速度,论述ViT的成功不在注意力!
  12. 服务器清洗项目,服务器带电清洗流程和注意事项
  13. 研发管理 - 流程篇
  14. linux五笔输入法制作_五笔98输入法制做--for Linux ibus
  15. 教你自定义百度网盘分享密码 提取码
  16. 爬虫抓取暗黑3国服天梯榜数据及分析
  17. Day2 Excel与数据处理之定位条件、选择性粘贴及查找功能
  18. 计算机计算累计公式,““请问Excel表格求的合计数为什么和用计算器累加出的合计数不一致...
  19. ipa安装失败,以及安装办法
  20. Vue源码流程图(函数名与源码对应)

热门文章

  1. 1035 打印菱形图案
  2. Python批量统计数据分布的偏度并画图
  3. 国产数据库mysql_国产的数据库都有哪些?
  4. Win10中安装Oracle11g
  5. 【JAVA】8.继承(图形面积问题)
  6. 计算机认知神经科学,认知科学对视知觉的认识
  7. 暴雪修改手机500服务器错误,改造:500内部服务器错误
  8. linux怎么共享打印机驱动程序,为samba共享的打印机添加Windows驱动
  9. Java求一元二次方程的根
  10. 微信朋友圈点赞设计测试用例