¿Quién puede informarme sobre la recursividad y el retroceso de Pascal?
El poder de la recursividad radica en definir infinitas colecciones de objetos con declaraciones finitas. Los programas escritos con pensamiento recursivo suelen ser muy concisos y fáciles de entender.
[Ejemplo 2] muestra las disposiciones en orden y postorden de un árbol binario. Descubra cómo se prioriza.
[Análisis] Al comparar las disposiciones en orden y posorden del árbol binario, se pueden encontrar el nodo raíz y los subárboles izquierdo y derecho. De manera similar, al comparar el orden inverso y el orden inverso del subárbol izquierdo, se puede encontrar el nodo raíz del subárbol izquierdo... Se puede ver que este problema se puede describir de forma recursiva. Cuando se encuentra el último nodo raíz, la recursividad no puede continuar, que es la condición límite para el final de la recursividad. Se puede ver que la idea de divide y vencerás suele estar implícita en los algoritmos recursivos. El proceso es el siguiente:
Programa Chu 01_3;
var z, h: string;
Proceso find(a, b: string);
Proceso find(a, b: string);
p>
Definir variables
s, l: entero
Inicio
l:=longitud (b);
Si l = 1, entonces escriba (b) {condiciones de contorno y segmento de retorno recursivo}
Otros
Iniciar {segmento directo recursivo}
escriba (b[ l]);
s:=pos(b[l],a);
Si s-1>0 entonces busque (copiar(a,1, s-1) , copy(b, 1, s-1)); {subárbol izquierdo recursivo}
Si l-s >0 entonces busque (copy(a, s+1, l-s) , copy(b, s, l-s)); {subárbol derecho recursivo}
Fin
Fin
Inicio
readln(z); >
readln(h);
Buscar(z, h);
Readln
Fin.
[Aplicación de la recursividad]
1. Recursión clásica
Por ejemplo, el problema de la Torre de Hanoi: recursividad clásica, el problema original contiene subproblemas. Algunos problemas o estructuras de datos se describen de forma recursiva, por lo que la recursividad es natural.
2. Recursividad y recursividad
Las relaciones recursivas se establecen utilizando la idea de recursividad, como la secuencia de Fibonacci en los conejos. Pero la recursividad es más simple porque no hay segmento de retorno y, a veces, se puede implementar directamente a través de un bucle.
Divide y vencerás
Muchos métodos de divide y vencerás provienen del pensamiento recursivo o del procesamiento recursivo de descomposición + fusión.
Retroceso
Es más natural utilizar el retroceso para resolver problemas de pequeña escala. Preste atención a guardar y restaurar el sitio antes y después de la recursividad, es decir, el problema de transformación correcto.
5. Programación dinámica
La naturaleza superpuesta de los subproblemas de programación dinámica es similar a la recursividad. La recursividad + modificación dinámica de tablas de búsqueda es una buena forma de crear modelos de programación dinámicos.
6. Otros
Otros simplemente no son fáciles de categorizar. Como procesamiento de expresiones, permutación y combinación, etc. Por cierto, es muy conveniente utilizar la recursividad para solucionar problemas de esquemas de impresión.
[Ejemplo 3] Encuentra el número total de formas de dividir un número entero n por la suma de k enteros positivos diferentes.
[Análisis] Este es un problema de programación dinámica. La ecuación dinámica es la siguiente:
f[i-1, j]+f[i, j-I]+1((. j mod I = 0)y(j div I = 1))
f[i,j]:= f[i-1,j](I>=j)
f[i-1,j]+f[i,j-i](de lo contrario)
s:=f(k,n-k)
Este problema se puede solucionar mediante recursividad de bucle También puedes considerar el uso de la recursividad para resolver este problema.
El proceso principal es el siguiente:
Opción 1:
Programa de trabajo (I, j: longint; var s: longint
var t: longint);
p>Inicio
Si (i=1) o (j=1) entonces s:=1
Si no, si (i=0) o (j=0) Entonces s:=0
De lo contrario, comience
Si (j mod i=0) y (j div i=1), entonces
Inicio
Trabajo(i-1,j,s);
t:= s;
Trabajo(I,j-1,s);
s:= s+t+1;
Fin
si no (I & gt;=j) entonces
Trabajar (i-1, j)
En caso contrario empezar
Trabajar(i-1,j,s);
t:= s;
Trabajo( I, j-1, s);
s:= s+t
Fin
Fin
Opción 2: Procesar búsqueda (v,w,último:byte);
var i:byte;
Iniciar
Si w=0, luego inc(count )
Otros
Si w=1, entonces
Si v & gt=last entonces buscar(0, 0, 0) else
else for i:=último en v-1 para buscar (v-i, w-1, I
Fin
Se puede ver que el el programa 1 es largo y consume mucho espacio de pila; la segunda opción es más simple, utiliza menos espacio de pila y es más eficiente. Por tanto, también existe un problema de optimización utilizando algoritmos recursivos. La simplicidad del algoritmo afecta directamente la viabilidad y eficiencia del programa.
[Resumen]
La recursión hace que algunos problemas complejos sean más fáciles de manejar, especialmente cuando se aprende diseño de algoritmos y estructuras de datos. Sin embargo, cada vez que se ejecuta la recursividad, es necesario asignar espacio de pila para las variables locales y las direcciones de retorno, lo que reduce la eficiencia operativa y limita la profundidad de la recursividad. Por lo tanto, cuando sea necesario, solo se puede utilizar el pensamiento recursivo para resolver el problema y el programa se escribe de forma no recursiva.
El método de retroceso, también conocido como método heurístico, renuncia al límite en el tamaño del problema y enumera y prueba las soluciones al problema una por una en un orden determinado. Cuando descubra que la solución actual no puede tener solución, elija la siguiente solución. Si la solución actual no cumple con los requisitos del problema, continúe expandiendo la escala de la solución actual y continúe explorando. Si la solución actual cumple con todos los requisitos, es la solución al problema. Al retroceder, el proceso de abandonar el plan actual y buscar el siguiente plan se llama retroceder.
En términos generales, existen dos tipos de problemas que requieren la resolución de computadoras:
1. Problemas descritos con fórmulas matemáticas precisas o lenguaje algorítmico explícito. Por ejemplo, el cálculo de pi, factorial de varios dígitos, etc.
2. En el proceso de completar una cosa, hay varios pasos y cada paso tiene varias ramas posibles. Para completar la tarea con éxito, hay algunas reglas que se deben seguir, pero estas reglas no pueden describirse con precisión mediante fórmulas matemáticas o lenguaje.
Para el segundo tipo de problema, generalmente se utiliza el método exhaustivo o el método de retroceso para resolverlo. El método exhaustivo consiste en enumerar todas las posibilidades del problema una por una. El método de retroceso es una estrategia de control del método exhaustivo. Enumera las soluciones que pueden completar con éxito la tarea. Es un método exhaustivo innecesario y bien organizado. Algoritmo de búsqueda. La idea básica es: durante el proceso de búsqueda, dado que la solución no se puede resolver en el estado actual, es necesario volver al enlace anterior en el proceso de búsqueda y buscar una solución nuevamente.
¿Cómo aprender a retroceder para resolver problemas? Primero echemos un vistazo a cómo utilizar el método exhaustivo para resolver el problema: Para facilitar un análisis más detallado del problema, el siguiente es un ejemplo (problema de reinas):
Descripción del problema: coloque cuatro reinas sobre un tablero de ajedrez 4×4, para que no puedan atacarse entre sí. No puede haber varias reinas en la misma fila, columna o diagonal. ¿Cuántas maneras hay?
Método exhaustivo:
Enumera todas las posibilidades de las cuatro reinas en el tablero de ajedrez y luego decide si atacar al oponente una por una. El procedimiento es el siguiente.
Método retrospectivo:
A la hora de buscar soluciones, debemos considerarlas enlace por enlace. Cuando se han probado todas las soluciones en un determinado enlace pero no se ha encontrado ninguna solución adecuada, tenemos que volver al enlace anterior y continuar explorando soluciones inexploradas. El proceso es el siguiente:
Programa qi 16;
Definir variables
I, t, an: palabra;
co, bo: tipo booleano;
Respuesta: Bytes del array [1..4];
Constante
n = 4; CT = 4;
Inicio
t:= 0; an:= 0;
Repetir
Inc(t); a[t]:= 0;
Repetir
Inc(a[t]);
bo:= false;
co:= false;
Si a[t]>CT entonces bo:=true
De lo contrario, comience
co:=true;
para I:= t -1 abajo a 1 haz {Comparar fila por fila con la fila donde está colocada la reina}
Si (t-i=abs(a[t]-a[i]) o (a[t]= a[i ]), entonces
co:= false;
end;
si bo, entonces inicia dec(t); , pero no Si se encuentra una solución adecuada, regrese}
Si t=0 entonces co:= true;
Fin;
Hasta co; p>
Si t & gt=n entonces
Iniciar {resultado de salida}
inc(安);
Escribir (' # ', un , ' ' :10);
Para i:=1 an, escriba(chr(64+i),':',a[i],'');
Escribiendo
Fin
Hasta t = 0;
Si an=0, entonces writeln('sin respuesta');
Fin.