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

简介: <<算法很美>>——(四)——深入递归<一>——自上而下,自下而上

前言


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

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


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

上楼梯


image.png

思路:

image.png

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

#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;
}

例题练习:爬楼梯

机器人走方格


image.png

思路:

ecf99d87cff5441bb8d6dab9b75d0c0d.png

自上而下:递归

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

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

image.png

代码:

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];
 }

image.png

相关文章
|
1月前
|
机器学习/深度学习 算法
递归算法题练习(数的计算、带备忘录的递归、计算函数值)
递归算法题练习(数的计算、带备忘录的递归、计算函数值)
|
1月前
|
机器学习/深度学习 数据采集 监控
机器学习-特征选择:如何使用递归特征消除算法自动筛选出最优特征?
机器学习-特征选择:如何使用递归特征消除算法自动筛选出最优特征?
69 0
|
1月前
|
存储 缓存 算法
【数据结构与算法】【小白也能学的数据结构与算法】递归 分治 迭代 动态规划 无从下手?一文通!!!
【数据结构与算法】【小白也能学的数据结构与算法】递归 分治 迭代 动态规划 无从下手?一文通!!!
|
13天前
|
算法
算法系列--递归(一)--与链表有关(上)
算法系列--递归(一)--与链表有关
27 0
|
17天前
|
存储 算法 搜索推荐
【数据结构与算法】归并排序(详解:递归与非递归的归并排序 | 赠:冒泡排序和选择排序)
【数据结构与算法】归并排序(详解:递归与非递归的归并排序 | 赠:冒泡排序和选择排序)
|
1月前
|
存储 编解码 自然语言处理
【软件设计师备考 专题 】深入理解数据压缩、递归和图的相关算法
【软件设计师备考 专题 】深入理解数据压缩、递归和图的相关算法
64 0
|
1月前
|
算法 Java 定位技术
【数据结构与算法】递归、回溯、八皇后 一文打尽!
【数据结构与算法】递归、回溯、八皇后 一文打尽!
|
1月前
|
存储 算法 C语言
【数据结构与算法】【约瑟夫问题】还在用递归?教你用链表秒杀约瑟夫
【数据结构与算法】【约瑟夫问题】还在用递归?教你用链表秒杀约瑟夫
|
2月前
|
搜索推荐 算法 C++
【递归版】归并排序算法(1)
【递归版】归并排序算法(1)
22 0
|
3月前
|
搜索推荐 算法
排序算法——归并排序(递归与非递归)
排序算法——归并排序(递归与非递归)