contente
prefácio
Em seguida, o blog anterior explicou detalhadamente a ideia de recursão. Continuaremos analisando a recursão com mais profundidade. Este artigo explica principalmente as ideias de baixo para cima e de cima para baixo do artigo anterior com mais profundidade.
O que é " de cima para baixo "? Ele se estende de cima para baixo, começando de um problema original de maior escala, como f(20), e gradualmente decompõe a escala para baixo até os dois casos base de f(1) e f(2), e então retorna camada por A resposta é chamada de "top-down".
O que é " de baixo para cima "? Por sua vez, começamos diretamente de baixo, o mais simples, o menor tamanho do problema e os resultados conhecidos de f(1) e f(2) (caso base) e empurramos para cima até chegarmos à resposta desejada f(20) . Essa é a ideia de "recursão", que também é a razão pela qual a programação dinâmica geralmente se livra da recursão, mas completa o cálculo por iteração de loop.
suba as escadas
Ideias:
Top-down : recursion , você descobrirá que esse código parece muito simples, mas é difícil de entender, porque é escrito de trás para frente ao longo do caminho,
#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;
}
Bottom-up : iteração , isso é fácil de entender, está escrito ao longo do caminho , ou seja, definir três variáveis x1, x2, x3 para registrar o número de passos que cada passo precisa dar, e atualizá-lo a tempo;
#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;
}
Exemplo de exercício: subir escadas
robô andando quadrado
Ideias:
De cima para baixo : recursão
int solvw(int x, int y)
{
if (x == 1 || y == 1)return 1;//边界即推理的起点
return solvw(x - 1, y) + solvw(x, y - 1);
}
Bottom-up: iteração; você descobrirá que quando um do número de linhas ou colunas é 1, não importa quantas você tome para a outra, há apenas um caminho a percorrer, e o limite é o ponto de partida da inferência; dois componentes determinam um valor Nesse momento ele é uma estrutura de tabela bidimensional.
Código:
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];
}