Está en la página 1de 4

PRACTICA Recursividad

FUNDAMENTO TEORICO: Existen muchas funciones matemticas cuyos argumentos son nmeros naturales, que pueden definirse de manera recursiva. Esto quiere decir que el valor de la funcin para el argumento n puede definirse en trminos del argumento n-1 (o alguno anterior). En este tipo de definiciones siempre existir un caso base a partir del cual parte la definicin, el cual normalmente es el valor de la funcin en cero o en uno, aunque no necesariamente debe ser as. EJEMPLO 1: Por ejemplo, el factorial puede definirse de manera recursiva de la siguiente manera:

Para definir una funcin en forma recursiva es necesario especificar:


Caso(s) base: Donde la recursividad se detiene Paso de recursin: Como se define un elemento distinto del base, en trminos de elementos anteriores.

Usualmente los lenguajes de programacin permiten definir funciones de manera recursiva. El lenguaje C es uno de ellos. La definicin recursiva para el factorial sera:
int factorial(int n) { if ((n == 0) || (n == 1)) return(1); else return(n*factorial(n-1)); }

Normalmente las definiciones recursivas pueden expresarse en forma no recursiva. Sin embargo, dependiendo del caso, el resultado puede ser ms confuso. Por ejemplo, una funcin en C que calcula el factorial en forma iterativa sera:

int factorial(int n) { int i, fact = 1; for (i=2; i<=n; i++) fact = fact * i; return(fact);

Sin embargo, los algoritmos iterativos tienen una ventaja en cuanto al uso de memoria, si se comparan con los iterativos. La recursividad requiere que se guarde el estado de la ejecucin antes de cada llamado recursivo, implicando un gasto considerable de memoria. Es probable que, por esta razn, las versiones recursivas tengan mayores limitaciones al ejecutarse en un computador.

Ejemplo: Nmeros de Fibonacci La Sucesin de Fibonacci es una secuencia de nmeros naturales, que empieza con 0 y 1, y cuyos siguientes trminos estn definidos como la suma de los dos anteriores:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...

Algoritmo Recursivo

Es bastante sencillo y natural definir la Sucesin de Fibonacci en forma recursiva:

A partir de esta definicin, se puede escribir una funcin en C que genere el trmino n-simo de la sucesin. En el siguiente ejemplo se presenta esta funcin, junto con un programa de prueba que pide un nmero entero al usuario y determina el correspondiente trmino de la sucesin.
Algoritmo Iterativo

En contraposicin a la implementacin recursiva que se present anteriormente, se ofrece aqu una versin iterativa de la funcin para calcular el n-simo trmino de la Sucesin de Fibonacci. Para implementar el algoritmo en forma iterativa, es necesario guardar en variables los valores para los dos trminos anteriores de la sucesin, para poder llevar a cabo el clculo del siguiente. Una vez hecho esto se actualizan los valores anteriores para preparar el siguiente clculo (siguiente iteracin). Compare ambas funciones. Aparentemente la versin recursiva es ms limpia y clara (fcil de entender) que su contraparte iterativa. Cul es su opinin?. Se mantiene el mismo programa de prueba empleado anteriormente.

Experimento Sugerido

Como se mencion al introducir la recursividad, la implementacin recursiva de un algoritmo normalmente consume ms memoria que su contraparte recursiva. Esto se debe a que es necesario guardar el estado actual de la ejecucin antes de cada llamado recursivo. Esto puede provocar limitaciones importantes en los programas que emplean funciones recursivas. Se sugiere probar los dos programas ofrecidos en esta seccin para valores altos (a partir de 20) y comparar los resultados obtenidos.
Variantes Propuestas

A manera de ejercicio pueden escribirse variantes de este programa, que empleen la funcin Fibonacci, ya sea iterativa o recursiva:

Programa que lee un nmero y dice si pertenece a la Sucesin de Fibonacci. Programa lee un nmero entero n y despliega en pantalla los primeros n trminos de la Sucesin de Fibonacci. En este caso, existe alguna ventaja en usar una versin sobre la otra?, por qu?.

Ejemplo: Funcin para calcular mdulo

El operador binario mdulo obtiene el resto o residuo de la divisin de dos nmeros enteros. Es bastante sencillo definir en forma recursiva la operacin m md n. La idea es ir restando el divisor del dividendo y calculando de nuevo el mdulo, pues el resultado es el mismo. La recursividad se detiene cuando el divisor es mayor que el dividendo. En ese caso el resultado es el dividendo. La definicin sera:

A partir de esta definicin, se puede escribir una funcin en C que calcule m md n, con m y n como los parmetros de la funcin. En el siguiente ejemplo se presenta esta funcin, junto con un programa de prueba que pide dos nmeros enteros al usuario, calcula la operacin y muestra en pantalla el resultado.

Ejercicio Propuesto

De manera similar a como se defini recursivamente el operador mdulo es posible definir el operador para divisin entera, es decir, divisin sobre operandos enteros y cuyo resultado es entero (se ignoran los decimales). Se deja como ejercicio la definicin recursiva de este operador y la implementacin de la funcin en C correspondiente. Como programa de prueba puede emplearse el mismo que se emple para el mdulo con unos pocos cambios.

También podría gustarte