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
[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.
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;
}