Un procedimiento o función puede contener una llamada a otro procedimiento dentro de él. Incluso, la subrutina puede llamarse a sí misma. En este caso, a la computadora no le importa. También, como siempre, ejecuta consistentemente los comandos que conoce de arriba a abajo.
Si recuerdas las matemáticas, ahí podrás conocer el principio de inducción matemática. Es el siguiente:
Cierta afirmación es verdadera para todo n natural si
1. es válido para n = 1 y
2. de la validez del enunciado para cualquier n = k natural arbitrario se sigue que es verdadero para n = k+1.
En programación, esta técnica se llama recursión
La recursividad es una forma de definir un conjunto de objetos en términos del propio conjunto, basándose en casos base simples dados.
Recursivo también se denominará un procedimiento (función) que se llama a sí mismo directamente o a través de otros procedimientos y funciones
Un ejemplo de un procedimiento recursivo:
procedimiento Rec(a: entero);
comenzar
si un > 0 entonces
Rec(a - 1);
escribe un);
fin;
Esquemáticamente, el trabajo de recursividad se puede representar mediante un diagrama de flujo
Se ejecuta el procedimiento Rec() con el parámetro 3. Luego, dentro del procedimiento con el parámetro 3, se llama al procedimiento con el parámetro 2, y así sucesivamente, hasta que se llama al procedimiento con el parámetro 0. Cuando el procedimiento con el parámetro 0 se llama al parámetro 0, la llamada recursiva ya no ocurrirá y el procedimiento con el parámetro 0 imprimirá el número 0 y terminará. Luego, el control se transfiere nuevamente al procedimiento con el parámetro 1, también termina su trabajo imprimiendo el número 1, y así sucesivamente. antes del procedimiento con el parámetro 3.
Todos los procedimientos llamados se almacenan en la memoria hasta que completan su trabajo. El número de procedimientos concurrentes se llama profundidad de recurrencia .
|
Hemos visto que la recursividad es la ejecución repetida de instrucciones contenidas en una subrutina. Y esto, a su vez, es similar al trabajo del ciclo. Hay lenguajes de programación en los que la construcción de bucle está completamente ausente, por ejemplo, Prolog.
Intentemos simular el funcionamiento del bucle for.
El bucle for contiene una variable de contador de pasos. En una subrutina recursiva, dicha variable se puede pasar como parámetro.
//Procedimiento LoopImitation() con dos parámetros
//Primer parámetro – contador de pasos, segundo parámetro – número total de pasos
procedimiento LoopImitation(i, n: entero);
comenzar
writeln('Hola N ', i); // Operador a repetir para cualquier valor de i
si < n entonces //Hasta que el contador de bucle sea igual al valor n,
LoopImitation(i + 1, n); //llamar a una nueva instancia del procedimiento, con el parámetro i+1 (transición al siguiente valor i)
fin;
|
Para comprender la recursividad, debe comprender la recursividad...
Iteración en programación — en un sentido amplio: organización del procesamiento de datos, en la que las acciones se repiten muchas veces, sin dar lugar a llamadas a sí mismas (a diferencia de %BA%D1%83%D1%80%D1%81%D0%B8%D1%8F" title="Recursion" >Recursiones). En el sentido estricto, mdash; proceso de procesamiento de datos cíclico de un paso.
A menudo, los algoritmos iterativos en el paso actual (iteración) utilizan el resultado de la misma operación o acción calculada en los pasos anteriores. Un ejemplo de tales cálculos es el cálculo de las relaciones de recurrencia.
Un ejemplo simple de un valor recursivo es el factorial: \(N!=1 \cdot 2 \cdot 3 \cdot \ ... \ \cdot N\)
El cálculo del valor en cada paso (iteración) es \(N=N \cdot i\) . Al calcular el valor de \(N\), tomamos el valor ya almacenado \(N\).< br />
El factorial de un número también se puede describir usando la fórmula recurrente :
Puede notar que esta descripción no es más que una función recursiva.
Aquí la primera línea ( \(n <= 1\)) — este es el caso base (condición final de la recursividad) y la segunda línea es la transición al siguiente paso.
La función factorial recursiva se vería así |
Compare el algoritmo para encontrar el factorial de la forma habitual, no recursiva |
función Factorial(n: entero): entero;
empezar
si n > 1 entonces
Factoriales := n * Factoriales(n - 1)
otra cosa
Factoriales := 1;
fin; |
x := 1;
para i := 2 a n hacer
x := x * i;
escribir(x); |
Debe entenderse que las llamadas a funciones implican una sobrecarga adicional, por lo que un cálculo factorial no recursivo será un poco más rápido.
Conclusión: donde puede escribir un programa con un algoritmo iterativo simple, sin recursión, entonces necesita escribir sin recursión. Pero aun así, existe una gran clase de problemas en los que el proceso computacional se implementa solo mediante recursividad.
Por otro lado, los algoritmos recursivos suelen ser más comprensibles.
|