<<El algoritmo es hermoso>>——(4)——recurrencia profunda <1>——de arriba hacia abajo, de abajo hacia arriba

 

contenido

prefacio

sube las escaleras

robot caminando plaza


prefacio

Luego, el blog anterior explicó la idea de la recursividad en detalle. Continuaremos analizando la recursividad con más profundidad. Este artículo explica principalmente las ideas de abajo hacia arriba y de arriba hacia abajo del artículo anterior con más profundidad.

¿Qué es " de arriba hacia abajo "? Se extiende de arriba hacia abajo, comenzando desde un problema original de mayor escala, como f(20), y gradualmente descompone la escala hacia abajo hasta los dos casos base de f(1) y f(2), y luego devuelve capa por capa La respuesta se llama "de arriba hacia abajo".

¿Qué es " de abajo hacia arriba "? A su vez, comenzamos directamente desde abajo, el más simple, el tamaño del problema más pequeño y los resultados conocidos de f(1) y f(2) (caso base) y empujamos hacia arriba hasta llegar a la respuesta deseada f(20) . Esta es la idea de "recursividad", que también es la razón por la que la programación dinámica generalmente se deshace de la recursividad, pero completa el cálculo mediante la iteración del bucle.

sube las escaleras

 

 Ideas:

 De arriba hacia abajo : recursividad , encontrará que este código parece muy simple, pero es difícil de entender, porque está escrito al revés en el camino,

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

De abajo hacia arriba : iteración , esto es fácil de entender, está escrito en el camino  , es decir, definir tres variables x1, x2, x3 para registrar la cantidad de pasos que debe tomar cada paso y actualizarlo en el tiempo;

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

Ejercicio de ejemplo: subir escaleras 

robot caminando plaza

Ideas:

 

De arriba hacia abajo : recursividad 

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

De abajo hacia arriba: iteración; encontrará que cuando uno de los números de filas o columnas es 1, no importa cuántos tome para el otro, solo hay un camino a seguir, y el límite es el punto de partida de la inferencia; dos componentes determinan un valor En ese momento es una estructura de tabla 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];
 }

Supongo que te gusta

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