Diseño y análisis de algoritmos: Capítulo 2 Algoritmo recursivo

Las características del método recursivo son: un problema requiere una serie de cálculos. Siempre hay una cierta relación entre las condiciones conocidas y el problema. Al calcular, si se puede encontrar la relación cuantitativa entre los procesos antes y después (Es decir, recursivo), entonces, desde el problema para empujar gradualmente a las condiciones conocidas, este método se llama retroceso. Ya sea hacia adelante o hacia atrás, la clave es encontrar una fórmula recursiva.
[ Ejemplo 1 ] Triángulo digital. La siguiente figura muestra un triángulo digital. Compile un programa para calcular una ruta de arriba a abajo en alguna parte, de modo que la suma de los números pasados ​​por la ruta sea la mayor. Solo se requiere la suma total.  
1. Un paso puede descender por la línea oblicua izquierda o la línea oblicua derecha;  
2. El número de líneas triangulares es menor o igual a 100;
3. Los números en el triángulo son 0, 1, ..., 99; Los datos de prueba se ingresan línea por línea a través del teclado, Los datos en el ejemplo anterior deben ingresarse en el formato que se muestra a continuación:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Inserte la descripción de la imagen aquí
[Análisis de algoritmo] Hay muchas soluciones a este problema, comenzando por la idea recursiva, imagínese que cuando Al caminar a lo largo de un cierto camino hacia la capa i-ésima y avanzar a la capa i + 1-th, nuestra elección debe ser avanzar a lo largo de la dirección del número más grande en las siguientes dos rutas posibles. Para este fin, podemos usar el método de empuje hacia atrás, establecer un [i] [j] almacena el valor máximo a partir de i, j y llega a la enésima capa, luego a [i] [j] = max {a [i] [j] + a [i + 1] [j], a [ i] [j] + a [i + 1] [j + 1]}, a [1] [1] es el valor máximo de la suma de los números.

#include<iostream> 
using namespace std; 
int main() 
{   
	int n,i,j,a[101][101];   
	cin>>n;
	for (i=1;i<=n;i++)    
		for (j=1;j<=i;j++)      
			cin>>a[i][j];                             
	for (i=n-1;i>=1;i--)    
		for (j=1;j<=i;j++)
		{      
			if (a[i+1][j]>=a[i+1][j+1])
				a[i][j]+=a[i+1][j];    
			else  
				a[i][j]+=a[i+1][j+1];      
		}    
		cout<<a[1][1]<<endl;  
}

[ Ejemplo 2 ] La secuencia que satisface F1 = F2 = 1, Fn = Fn-1 + Fn-2 se llama secuencia de Fibonacci (Fibonacci), y los primeros elementos son 1, 1, 2, 3, 5, 8 , 13, 21, 34 ... Encuentre el enésimo término de esta secuencia (n> = 3).
Es decir: f1 = 1 (n = 1)
f2 = 1 (n = 2)
fn = fn-1 + fn-2 (n> = 3)

#include<iostream> 
#include<cstdio> 
using namespace std; 
int main() 
{     
	int f0=1,f1=1,f2;     
	int n;     
	cin>>n;
	for (int i=3; i<=n; ++i)     
	{          
		f2=f0+f1;          
		f0= f1;          
		f1=f2;     
	} 
	printf("%d\n",f2); 
	return 0; 
} 

[ Ejemplo 3 ] Hay un cuadrado rectangular de 2χn, y el cuadrado está cubierto con un dominó 1 * 2.
Inserte la descripción de la imagen aquí
Escriba un programa, pruebe cualquiera de los n dados (n> 0) y obtenga el número total de métodos de pavimentación.
El siguiente es un programa de c ++ que ingresa n y emite x1 ~ xn:

#include<iostream> 
using namespace std; 
int main() 
{   
	int n,i,j,a[101];   
	cout<<"input n:";                       
	cin>>n;
	a[1]=1;a[2]=2;   
	cout<<"x[1]="<<a[1]<<endl;   
	cout<<"x[2]="<<a[2]<<endl;   
	for (i=3;i<=n;i++)                   
	{
		a[i]=a[i-1]+a[i-2];      
		cout<<"x["<<i<<"]="<<a[i]<<endl;     
	} 
} 

[ Ejemplo 4 ] Reproducción de insectos
[Descripción del problema] Los científicos han descubierto un tipo especial de insecto en los bosques tropicales, que tiene una gran capacidad de reproducción. Cada par de adultos pone y pares de huevos después de x meses, y cada par de huevos se convierte en adultos adultos después de dos meses. Suponiendo que cada adulto no muere, solo hay un par de adultos en el primer mes y el huevo no pone huevos en el primer mes después de que el adulto crece (poniendo huevos después de X meses), ¿cuántos pares de adultos hay después de Z meses? 0 = <X <= 20,1 <= Y <= 20, X = <Z <= 50
[formato de entrada] El valor de x, y, z
[formato de salida] Después de Z meses, el número total de gusanos adultos
[entrada Muestra] 1 2 8
[Salida de muestra] 37

#include<iostream> 
using namespace std; 
int main() 
{   
	long long a[101]={0},b[101]={0},i,j,x,y,z;   
	cin>>x>>y>>z;
	for(i=1;i<=x;i++){a[i]=1;b[i]=0;}   
		for(i=x+1;i<=z+1;i++)              
		{     
			b[i]=y*a[i-x];     
			a[i]=a[i-1]+b[i-2];             }
		cout<<a[z+1]<<endl;   
		return 0; 
}		

[ Ejemplo 5 ]
Problema de número de dígitos [Descripción del problema] Entre todos los N dígitos, ¿cuántos de ellos tienen un número par de 3? Como el resultado puede ser grande, solo necesita enviar el valor de la respuesta a 12345.
[Formato de entrada] Lectura en un número N
[Formato de salida] Hay números pares 3 en la salida.
[Entrada de muestra] 2
[Salida de muestra] 73
[Tamaño de datos] 1 <= N <= 1000
[Descripción de la muestra] Entre los 2 dígitos, hay 72 incluyendo 0 3, incluyendo 2 3 Hay 1 de 73

#include<iostream> 
using namespace std; 
int main() 
{   
	int f[1001][2],n,i,x;   
	cin>>n;
	f[1][1]=1;f[1][0]=9;                           
	for(i=2;i<=n;i++)     
	{          
		x=f[1][0];       
		if(i==n)
			x--;
		f[i][0]=(f[i-1][0]*x+f[i-1][1])%12345;       
		f[i][1]=(f[i-1][1]*x+f[i-1][0])%12345;       
	}    
	cout<<f[n][0];     
	return 0; 
}
48 artículos originales publicados · Me gusta 25 · Visita 2453

Supongo que te gusta

Origin blog.csdn.net/qq_43628959/article/details/105061314
Recomendado
Clasificación