<<O algoritmo é lindo>>——(4)——recursão profunda <1>——de cima para baixo, de baixo para cima

 

contente

prefácio

suba as escadas

robô andando quadrado


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

Acho que você gosta

Origin blog.csdn.net/m0_58367586/article/details/123853951
Recomendado
Clasificación