Está en la página 1de 4

1

Recursividad y Programación Lógica


La Paz,Morató
Reynaldo Vladimir Hurtado Bolivia

Universidad Mayor de San Andrés


Resumen—En este artículo se complementa con ejemplos la
metodología expuesta por Raja Sooriamurthi [1] para la
construcción y desarrollo de algoritmos recursivos. Estos
ejemplos permiten apreciar la sencillez y belleza de esta
metodología.

Palabras clave—Prolog, recursividad.

I. RECURSIVIDAD

E N esta sección se va a demostrar que la recursividad


puede ser tratada con mucha más facilidad si se piensa
en que hace el algoritmo y no en como lo hace. Para lograr
este objetivo se va a hacer uso de la modularidad. Los siguientes pasos son muy útiles al momento de diseñar
un algoritmo recursivo.
A. Dividir y Conquistar
Un problema puede ser resuelto utilizando modularidad, la
B. Caso Base.- La más pequeña instancia del problema
cual se consigue con la simple idea de dividir y conquistar. para la cual conocemos la respuesta sin mayor esfuerzo. Para
La estrategia de dividir y conquistar establece: ello se necesitan dos elementos
1. Dividir un problema grande en piezas pequeñas
- Un test para reconocer el caso base
2. Resolver las piezas pequeñas
- Una respuesta para el caso base
3. Combinar las soluciones
C. Simplificación de la Rutina.- Algo que nos ayude a
Por ejemplo, si consideramos el caso de comprar un auto, el encoger el tamaño del problema hacia el caso base.
problema puede dividirse en otros dos: D. Recursión Natural.- Expresa una llamada recursiva
a. buscar el auto que uno quiere de la función a la versión simplificada del problema
b. conseguir financiamiento
E. Completación.- Dada la solución es necesario
preguntar que es lo que se necesita hacer con la respuesta de
la llamada recursiva para formar la respuesta del problema
original. Es necesario pensar en cual es la respuesta que da
la llamada recursiva y evitar preguntar como funciona.
El siguiente ejemplo aclara el procedimiento descrito.

Ejemplo 5.- Sumar los dígitos de un número entero

Solución.- Para simplificar el análisis del problema es


aconsejable utilizar un caso específico y no así el caso más
general.
Para el ejemplo utilizamos el número 2368 = 2+3+6+8 = 20
En este caso se ha dividido un problema grande en dos
subproblemas, cada uno posiblemente de diferentes tipos. a. Caso base.- La solución es trivial, para los enteros de un solo
La recursión es un caso especial de dividir y conquistar dígito.
donde los subproblemas individuales son del mismo tipo. De - Test: n < 10
manera figurativa, para resolver un cuadrado no se debe - Respuesta: n
dividir en un pequeño triángulo y un pequeño óvalo sino en
pequeños cuadrados. b. Simplificación de la rutina.- Se necesita dividir el problema
en subproblemas del mismo tipo, y existen varias maneras de
hacer esto:
2 368 = 2 + (3+6+8)
2

23 68 = (2+3) + (6+8) II. PROBLEMAS RESUELTOS


236 8 = (2+3+6) + 8 A continuación se resuelven varios problemas utilizando el
método descrito.
Cada una de las divisiones debería funcionar en teoría, es
así que la atención debería centrarse en cual de ellas es más A. Calcular el factorial de un número natural N.
fácil de implementar en la práctica. En nuestro caso
utilizaremos la tercera opción. Solución.-

a. Caso base.- El caso base se da cuando N = 0. Para esta


2368 situación el factorial es 1.
- Test: N= 0
- Respuesta: 1
b. Simplificación de la rutina.- Supongamos que queremos
encontrar el factorial de 6, para ello podemos dividir el
236 8 problema en subproblemas del mismo tipo

6! = 1*2*3*4*5*6

c. Recursión Natural.- Este es un paso mecánico que no Algunas posibles subdivisiones del problema son:
requiere de mucha reflexión
1 23456 = 1*(2*3*4*5*6)
sumarDigitos(236) = sumarDigitos(N/10) 12 3456 = (1*2*3)*(4*5*6)
123 456 = (1*2*3*4*5)*6
donde ‘/ ‘denota la división entera.
d. Completación.- Asumiendo que conocemos la respuesta a Si elegimos la tercera opción obtenemos 6! = 5!*6
la recursión natural, necesitamos saber qué más debe ser //
hecho para determinar la respuesta final.
En la recursión natural sumarDigitos(236) deberá dar 12
como respuesta. Dado este valor necesitamos adicionar el
1*2*3*4*5*6
primer dígito (8) para obtener la respuesta final. La
completación es:

sumarDigitos(N/10) + n%10
1*2*3*4*5 6
donde ‘%’ es el operador módulo.
e. Solución Prolog.- Poniendo todo junto y utilizando
Prolog como lenguaje de programación, obtenemos la c. Recursión Natural.-
siguiente solución:
sumarDigitos((N,N):- N < 10; factorial(5) = factorial(N-1)
sumarDigitos(N,S):- N <= 10, N1 is N/10,
N2 is mod(N,10), d. Completación.- Conociendo la respuesta de la recursión
sumarDigitos(N1, X), natural el resultado debe multiplicarse por N. La completación
S is X + N2; es:
factorial(N-1)*N
La primera línea devuelve el mismo número si este es e. Solución Prolog.-
menor a 10. factorial(0,1);
En la segunda línea N1 es igual a los dígitos de N factorial(N,F):- factorial(N-1,R),
excluyendo el primero, y N2 es igual al primer dígito. X es el F is N*R;
resultado de aplicar la función a los dígitos de N1 y finalmente B. Calcular el N-ésimo término de la serie de Fibonacci
el resultado S es igual al obtenido en X más N2.
Aquí se puede ver como funciona el algoritmo, se supone
Solución.-
que la función sumarDigitos devuelve la suma de los dígitos
del número que es introducido, y como sabemos que esto a. Caso Base.- El fibonacci de 0 es 1, y el fibonacci de 1 es 1.
funciona confiamos en que la función nos devolverá el
- Test: N = 0 ó N = 1
resultado correcto cuando introducimos N1. Es decir que
- Respuesta: 1
sabemos que es lo que hace la función pero ignoramos como
b. Simplificación.- Se sabe que un término de la serie de
lo hace.
fibonacci es la suma de los dos términos de fibonacci
3

anteriores discos de un eje inicial a un eje final, el problema se simplifica


moviendo N-1 discos de un eje a otro intermedio, luego se
mueve el disco restante (disco mayor) al eje final (caso base).
Fib(6)

Fib(5) Fib(4)

c. Recursión Natural

fibonacci(5) = fibonacci(N-1)
fibonacci(4) = fibonacci(N-2) c. Recursividad Natural.- Sea la función mueve(N, I, C, D)
d.Completación.- que mueve N discos de I a D. La recursividad natural conduce
a mover N-1 discos de I a C, de donde se tiene
fibonacci(N) = fibonacci(N-1) + fibonacci(N-2)
mueve(N-1, I, D, C)
e.- Solución Prolog
d. Completación.- Se debe mover N-1 discos de la posición
fib(0,1); inicial a una posición intermedia, el disco que resta se mueve a
fib(1,1). la posición final, luego se mueven los N-1 discos restantes a la
fib(N,F):- fib(N-1,R1), fib(N-2,R2), posición final
F is R1 + R2.
mueve(N, I, C, D) = mueve(N-1, I, D, C),
C. Torres de Hanoi.
mueve(1, I, C, D), mueve(N-1, C, I, D)
Se tienen tres ejes y N discos de diferentes radios. Solo se
permite que los discos de radio menor vayan sobre los de radio
e. Solución Prolog
mayor.
Inicialmente se apilan todos los discos sobre el eje izquierdo
mueve(1, I, C, D);- imprime(‘mueve de’ I ‘a’ D).
y la finalidad es trasportarlos al eje derecho.
mueve(N, I, C, D):- mueve(N-1, I, D, C),
mueve(1, I, C, D),
mueve(N-1, C, I, D).

D. Obtener los elementos de una lista

Solución.- Se tiene la lista L

a. Caso Base.- Obtener el primer elemento de la lista

- Test: es el primer elemento de la lista?


- Respuesta: primer elemento
Solución.-
b. Simplificación.- Si no es el primer elemento, generar una
a. Caso base.- Se tiene el mayor disco no acomodado sobre uno de nueva lista sin el primer elemento y buscar sobre esta nueva
los ejes. Se mueve el disco al eje derecho lista
c. Recursión Natural.- Las listas pueden dividirse en una
- Test: disco mayor no acomodado sobre eje cabeza y una cola [H|T]. Si elemento(X, L, R) extrae el
izquierdo o central elemento X de la lista L y genera una sublista R que contiene
- Respuesta: mover el disco al eje derecho todos los elementos de L menos X, la recursión natural será:

b. Simplificación.- Si el problema consiste en mover N elemento(X, [H|T], [H|NT]):- elemento(X, T, NT).


4

d. Completación.- El código completo es b. simplificación.- La combinación de N elementos de L es


equivalente a extraer un elemento de L y combinar N-1 elementos
restantes
elemento(X, [X|T], T).
elemento(X, [H|T], [H|NT]):- elemento(X, T, NT). c. Recursión Natural

Nota.- El predicado elemento(X, L, R) resuelve como elimina(X, L, R), combinación(N-1, R, T).


verdadero si la lista L contiene al elemento X. Este predicado
genera también una sublista R que contiene todos los d. Completación.- Se debe concatenar el elemento eliminado con la
sublista combinada
elementos de L menos X. Este predicado puede también ser
usado para eliminar un elemento X de la lista L dando como combinación(N, L, [X|T]):- elimina(X, L, R),
respuesta R. combinación(N-1, R, T).
e.Solución Prolog
E. Permutación de una lista
combinacion(0, L, []).
combinacion(N, L, [X|T]):-elimina(X, L, R),
Solución.- La permutación de una lista es un conjunto de listas
combinación(N-1, R, T).
que contienen todos los elementos de la misma en cierto
orden.
Sea el predicado permutación(L, S) que genera en S una
permutación de L III. CONCLUSIONES
En este artículo, el método para la obtención de algoritmos
a. Caso Base.- La permutación de una lista vacía es una lista vacía recursivos descrito en [1], ha sido complementado con
ejemplos que van desde problemas elementales de análisis
permutación([], []). combinatorio hasta un problema más elaborado como es el de
las Torres de Hanoi.
b. Simplificación.- Se extrae un elemento de la lista y se permuta la
sublista resultante
REFERENCIAS
c. Recursión Natural.- [1] Raja Sooriamurthi, Problems in Comprehending Recursion and
Suggested Solutions (Paper style) , Proceedings of the 6 th annual
elimina(X, L, T), permutación(T, P) conference on Innovation and Technology in Computer Science
Education (ITICSE), Canterbury, UK, jume 2001, pp 25-28.
[2] Rodolfo J. Rodriguez R., Fundamentos de Programaciín Lógica: El
d. Completación.- Se debe concatenar el elemento eliminado con la Prolog. http://ccognoscitiva.iespana.es/rrr_prolog.pdf
sublista permutada
[3] Roman Barták., Guide to Prolog Programming. http://kti.mff.cuni.cz/
permutación(L, [H|P]):- elimina(H, L, T), ~bartak/prolog/combinatorics.html, 1998
permutación(T,P).

e. Solución Prolog

permutación([], []).
permutación(L, [H|P]):-elimina(H, L, T),
permutación(T, P).
elimina(X, [X|T], T).
elimina(X, [H|T], [H|NT]):-elimina(X, T, NT).

F. Combinaciones
Es un subconjunto arbitrario de un conjunto conteniendo un
número dado de elementos donde el orden no es importante.

Solución.- Sea combinación(N, L, C) la combinación de N


elementos de la lista L que da como resultado la sublista C.

a. Caso Base.- La combinación de cero elementos de una lista da


como resultado la lista vacía.

combinación(0, L, []).

También podría gustarte