Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Work Paper #2
Work Paper #2
WORK PAPER #2
RECURSIVIDAD
PROGRAMACIN RECURSIVA
Crear una subrutina recursiva requiere principalmente la definicin de un "caso base", y entonces
definir reglas para subdividir casos ms complejos en el caso base. Para una subrutina recursiva
es esencial que con cada llamada recursiva, el problema se reduzca de forma que al final llegue
al caso base.
Algunos expertos clasifican la recursin como "generativa" o bien "estructural". La distincin se
hace segn de donde provengan los datos con los que trabaja la subrutina. Si los datos proceden
de una estructura de datos similar a una lista, entonces la subrutina es "estructuralmente
recursiva"; en caso contrario, es "generativamente recursiva".
Muchos algoritmos populares generan una nueva cantidad de datos a partir de los datos
aportados y recurren a partir de ah. HTDP (How To Design Programs), al espaol, "Cmo disear
programas", se refiere a esta variante como recursin generativa. Ejemplos de recursin
generativa incluyen: mximo comn divisor, quicksort, bsqueda binaria, mergesort, Mtodo de
Newton, fractales e integracin adaptiva.
Suma Recursiva
Para convertir la suma en una funcin recursiva se la debe descomponer en algo ms elemental.
Entonces surge la pregunta: Qu operacin puede ser ms elemental que la suma? Aunque no
lo parezca la respuesta es muy simple: la suma se puede descomponer en conteos de 1 en 1. Es
decir, si se quiere sumar los nmeros 5 y 3 se sabe que el resultado es 8, y se podra llegar a ese
mismo resultado, si en vez de sumar se descomponen las unidades que componen al segundo
nmero (en este caso el 3) en sus unidades correspondientes de la siguiente manera:
8
SumaRecursiva 5 3 8
7
SumaRecursiva (5 2) 1 8
6
SumaRecursiva (5 1) 1 7
5
SumaRecursiva (5 0) 1 6
Como puede apreciarse en la figura, se ingresa a la funcin recursiva en 4 oportunidades
distintas. En las 3 primeras la funcin se invoca a s misma rebajando el valor del segundo
sumando en 1 hasta llegar a 0. Cuando ingresa por cuarta vez el valor del segundo sumando que
ya es 0, hace que la funcin retorne el valor del primer sumando (que es 5) y empieza a salir
consecutivamente de las 4 veces que ingres a s misma, sumando en 3 oportunidades 1 al valor
de la funcin.
Factorial Recursivo
Un ejemplo clsico de una subrutina recursiva es la funcin usada para calcular el factorial de
un entero.
Definicin de la funcin:
Pseudocdigo (recursivo):
funcin factorial:
input: entero n de forma que n >= 0
output: [n (n-1) (n-2) 1]
1. if n es 0, return 1
2. else, return [ n factorial(n-1) ]
end factorial
Una relacin recurrente es una ecuacin que relaciona trminos posteriores en la secuencia con
trminos previos.
Relacin recurrente de un factorial:
b4 = 4 * b3
= 4 * 3 * b2
= 4 * 3 * 2 * b1
= 4 * 3 * 2 * 1 * b0
=4*3*2*1*1
=4*3*2*1
=4*3*2
=4*6
= 24
Esta funcin factorial tambin puede describirse sin usar recursin haciendo uso de tpicas
estructuras de bucle que se encuentran en lenguajes de programacin imperativos:
Pseudocdigo (iterativo):
2. begin loop
1. si n es = 0, salir del loop
2. cambiar running_total a (running_total n)
3. decrementar n
4. repetir el loop
3. return running_total
end factorial
La importancia de recursin de cola es que cuando se realiza una llamada recursiva de cola, la
posicin de retorno de la funcin que llama necesita grabarse en el call stack; cuando la funcin
recursiva retorna, continuar directamente a partir de la posicin de retorno grabada previamente.
Por ello, en compiladores que dan soporte a optimizacin de recursin de cola, este tipo de
recursin ahorra espacio y tiempo.
ORDEN EN EL LLAMAMIENTO DE UNA FUNCIN
El orden de llamamiento de una funcin puede alterar la ejecucin de una funcin, vase este
ejemplo en C:
Funcin 1
void recursiveFunction(int num) {
if (num < 5) {
printf("%d\n", num);
recursiveFunction(num + 1);
}
}
CUESTIONARIO
1. Qu es la recursividad?
2. Dar una definicin de lo que son los fractales. Investigar al respecto.
3. Cul es la diferencia entre las funciones de recursividad de cola y las que no lo son?
4. A qu se refiere la recursividad directa y la recursividad indirecta?
5. Basndose en la funcin de la suma recursiva, programe la funcin recursiva para la resta.
6. Programe la funcin recursiva para la divisin.
7. Programe la funcin recursiva para el algoritmo de Euclides.
8. Programe la funcin recursiva para la potencia entera (34 = 81).