5
Unidad IV Tema 7: Recursividad Profesor: Jorge Escalona / Tobías Bolívar Email: [email protected] / [email protected] Página Web: http://estructuradatos.tripod.com

Tema7

Embed Size (px)

Citation preview

Page 1: Tema7

Unidad IV

Tema 7: Recursividad

Profesor: Jorge Escalona / Tobías Bolívar

Email: [email protected] / [email protected]

Página Web: http://estructuradatos.tripod.com

Page 2: Tema7

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

Page 3: Tema7

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

Page 4: Tema7

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

Page 5: Tema7

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