1. Unidad IV
Tema 7: Recursividad
Profesor: Jorge Escalona / Tobías Bolívar
Email: escaljorge@gmail.com / tobiasbolivar@gmail.com
Página Web: http://estructuradatos.tripod.com
2. Procedimientos Recursivos
• Un procedimento P es llamado directamente recursivo si contiene una
llamada a él mismo.
• Un procedimiento P es llamado indirectamente recursivo si contiene una
llamada a un procedimiento Q, el cual directa o indirectamente llama a P.
• Un caso especial de recursión directa es cuando la(s) llamada(s) recursiva(s)
es(son) la(s) última(s) instrucción(es) del procedimento. Esto es llamado
recursión en el final. Típicamente la llamada es la última instrucción de una
sentencia condicional:
P y P
if B then S; P S; if B then P
• La recursión en el final puede, por razones de eficiencia, siempre ser
transformado a un procedimiento iterativo. Definiciones equivalentes de P son:
P y P
while ¬B do S repeat S until ¬B
3. Esquema para eliminar la recursividad por el final
• Este esquema puede ser generalizado como sigue.
• Se asume que el procedimiento original P(x) puede sr uno de los dos casos
sigientes, donde B, Q y S no contienen llamadas recursivas a P:
P(x) y P(x)
if B then S; P(e) Q; if B then S; P(e)
• Son transformadas en:
P(x) y P(x)
while ¬B do Q
S; x <-- e while ¬B do
S; x <-- e; Q
4. Ejemplo 1: Función Factorial
• El factorial de un entero n>= 0 (n!) es definido recursivamente por:
n! = 1 si n = 0
= n * (n -1)! si n > 0
• De aquí se puede escribir directamente un procedimiento recursivo de la
siguiente forma:
F(n)
if n = 0 then F <-- 1
else F <-- n * F(n-1)
• Para convertir esta función a un procedimiento iterativo, seguimos el esquema
del caso 1:
F(n)
F <-- 1;
while n > 0 do
F <-- F * n; n <-- n -1
5. Ejemplo 2: Búsqueda en Arboles
• Versión recursiva:
Busqueda-Arbol(x, k)
if x = NULL or k = x.clave then r <-- x
else
if k < x.clave then r <-- Busqueda-Arbol(x.izquierda, k)
else r <-- Busqueda-Arbol(x.derecha, k)
• Versión iterativa:
Busqueda-Arbol(x, k)
r <-- x
while (x ≠ NULL and k ≠ x.clave) then
if k < x.clave then r <-- x.izqierda
else r <-- x.derecha