Documentos de Académico
Documentos de Profesional
Documentos de Cultura
uso del programa anterior es muy ineficiente, pero es un ejemplo muy claro.
A continuacin se expone un ejemplo de programa que utiliza recursin indirecta, y nos
dice si un nmero es par o impar. Al igual que el programa anterior, hay otro mtodo
mucho ms sencillo de determinar si un nmero es par o impar, basta con determinar el
resto de la divisin entre dos. Por ejemplo: si hacemos par(2) devuelve 1 (cierto). Si
hacemos impar(4) devuelve 0 (falso).
/* declaracion de funciones, para evitar errores */
int par(int n);
int impar(int n);
int par(int n)
{
if (n == 0) return 1;
return impar(n-1);
}
int impar(int n)
{
if (n == 0) return 0;
return par(n-1);
}
En Pascal se hace as (notar el uso de forward):
function impar(n : Integer) : Boolean; forward;
function par(n : Integer) : Boolean; forward;
function par(n : Integer) : Boolean;
begin
if n = 0 then par := true
else par := impar(n-1)
end;
function impar(n : Integer) : Boolean;
begin
if n = 0 then impar := false
else impar := par(n-1)
end;
Ejercicio
La famosa sucesin de Fibonacci puede definirse en trminos de recurrencia de la
siguiente manera:
(1) Fib(1) = 1 ; Fib(0) = 0
(2) Fib(n) = Fib(n-1) + Fib(n-2) si n >= 2
Cuantas llamadas recursivas se producen para Fib(6)?. Codificar un programa que
calcule Fib(n) de forma iterativa.
Nota: no utilizar estructuras de datos, puesto que no queremos almacenar los nmeros
de Fibonacci anteriores a n; s se permiten variables auxiliares.
}
...
int numeros[5] = {2,0,-1,1,3};
int N = 5;
printf("%d\n",sumarray(numeros, 0, N));
Notar que la condicin de parada se cumple cuando se llega al final del array. Otra
alternativa es recorrer el array desde el final hasta el principio (de derecha a izquierda):
int sumarray(int numeros[], int posicion)
{
if (posicion == 0) return numeros[posicion];
else return numeros[posicion] + sumarray(numeros, posicion-1);
}
...
int numeros[5] = {2,0,-1,1,3};
int N = 5;
printf("%d\n",sumarray(numeros, N-1));
La razn por la que se incluye este ejemplo se debe a que en general no se conocer el
nmero de elementos de la estructura de datos sobre la que se trabaja. En ese caso se
introduce un centinela -como la constante -1 de este ejemplo o la constante NULO para
punteros, u otros valores como el mayor o menor entero que la mquina pueda
representar- para indicar el fin de la estructura.
else {
aux = mayor(numeros, posicion-1);
if (numeros[posicion] > aux)
return numeros[posicion];
else
return aux;
}
}
...
int numeros[5] = {2,4,1,-3,-1};
int N = 5;
printf("%d\n", mayor(numeros, 4));
Hay que tener cuidado con dos errores muy comunes: el primero es declarar la variable
para que se pase por valor y no por referencia, con lo cual no se obtiene nada. El otro
error consiste en llamar a la funcin pasando en lugar del parmetro por referencia una
constante, por ejemplo: mayor(numeros, 5-1, 0); en este caso adems se producir un
error de compilacin.
manera:
Ackermann(0, n) = n + 1
Ackermann(m, 0) = A(m-1, 1)
Ackermann(m, n) = A(m-1, A(m, n-1))
Aunque parezca mentira, siempre se llega al caso base y la funcin termina. Probar a
ejecutar esta funcin con diversos valores de n y m... que no sean muy grandes!. En
Internet pueden encontrarse algunas cosas curiosas sobre esta funcin y sus
aplicaciones.
Ejercicios propuestos
Nota: para resolver los ejercicios basta con hacer un nico recorrido sobre el array.
Tampoco debe utilizarse ningn array auxiliar, pero si se podrn utilizar variables de tipo
entero o booleano.
- Dado un array constituido de nmeros enteros y que contiene N elementos siendo N
>= 1, escribir una funcin que devuelva la suma de todos los elementos mayores que
el ltimo elemento del array.
- Dado un array constituido de nmeros enteros y que contiene N elementos siendo N
>= 1, escribir una funcin que devuelva cierto si la suma de la primera mitad de los
enteros del array es igual a la suma de la segunda mitad de los enteros del array.
- Dados dos arrays A y B de longitud n y m respectivamente, n >= m cuyos elementos
estn ordenados y no se repiten, determinar si todos los elementos de B estn
contenidos en A. Recordar que los elementos estn ordenados, de esta manera basta
con realizar un nico recorrido sobre cada array.
Conclusiones
En esta seccin se ha pretendido mostrar que la recursividad es una herramienta
potente para resolver mltiples problemas. Es ms, todo programa iterativo puede
realizarse empleando expresiones recursivas y viceversa.