Sie sind auf Seite 1von 5

Programacin.

Tema 5: Recursividad

(16/Mayo/2004)

Apuntes elaborados por: Raquel Lpez, Eduardo Quevedo y Aaron Asencio

Revisado por: Javier Miranda el ????

Tema 5.- Recursividad


NOTA Todos los ejemplos que se exponen en este tema se pueden realizar utilizando la implementacin del algoritmo Pila del tema anterior. Donde se encuentra la llamada a recursividad utilizamos el Push y en el return de la recursividad utilizaremos el Pop. La recursividad es posible gracias a la existencia de pilas. Las soluciones recursivas suelen ser bastante cortas pero cubren mucho ms espacio en la memoria del ordenador, este es el principal inconveniente de las soluciones recursivas. Esto se debe a que si un programa recursivo tiene variables dentro del mismo programa stas se crearn nuevas cada vez que se ejecute. Por este motivo en los procedimientos y funciones recursivos evitaremos pasar como parmetros arrays, matrices, , ya que estaremos haciendo un uso innecesario de la memoria. Si lo que queremos es una variable global entonces deber estar en el programa principal. Por ltimo aclarar la utilizacin de los parmetros de entrada (in) y de salida (out): IN Se comportan como constantes, no se pueden cambiar. Los valores introducidos en la pila no se modifican. OUT Son parmetros variables. Los valores se copian en la pila al elemento anterior. Los programas recursivos tendrn casi siempre la siguiente estructura: Avance Condicin de parada Procesamiento Se vera ms claro con un ejemplo: procedure Escribir ( N : in Natural) is begin if N = 0 then return; end if; Int_IO.Put (N); Escribir (N 1); Int_IO.Put (N); end Escribir;

Programacin. Tema 5: Recursividad

(16/Mayo/2004)

Qu es lo que sucedera?
En la pantalla veramos 1 2 3 321 La Pila la crea el propio compilador en ella guarda todas las variables, parmetros y procedimientos, as como la direccin de retorno (lnea donde se realiz la llamada anterior). Esta Pila se ir vaciando poco a poco se va deshaciendo el trabajo. Escribir 3

Escribir 2

Escribir 1

Algunos ejemplos de recursividad:


Para escribir una palabra al revs utilizando recursividad tendremos en cuenta que si escribo a la ida escribir la frase de forma correcta mientras que si escribo a la vuelta se escribir la frase al revs. Frase : String (1 .. 4) := Hola; procedure Escribir (N : in Natural) is begin if N > FraseLength then return; end if; Escribir (N + 1); Put (Frase (N)); end Escribir;

Qu es lo que sucedera?
Escribir A En la pantalla veramos Escribir L ALOH

Escribir O

Escribir H

Programacin. Tema 5: Recursividad

(16/Mayo/2004)

Para calcular el factorial de cualquier nmero, es muy til utilizar la recursividad, veamos como se hara: function Factorial (N : in Natural) return Natural is begin if N=0 then return 1; else return N*Factorial (N-1); end if; end Factorial;

Qu es lo que sucedera?

Factorial (0) Factorial (1) Factorial (2) Factorial (3) Factorial (4) Factorial (5)

1 1*1=1 2*1=2 3*2=6 4*6=24

Resultado
5*24=120

Casi todos las funciones y procedimientos iterativos pueden realizarse con funciones o procedimientos recursivos; como por ejemplo la bsqueda binaria. procedure Bsqueda_Binaria (Tabla : in T_Tabla; Valor : in Integer; Posicion : in out Integer ) is Primero : Natural := TablaFirst; Ultimo : Natural := TablaLast; Mitad : Natural := (Primero + Ultimo)/ 2; begin if TablaLenght then raise No_Encontrado;

Programacin. Tema 5: Recursividad


elsif Tabla (Medio) = Valor then Posicin := Medio; elseif Valor < Tabla (Medio) then Bsqueda_Binaria (Tabla (Primer .. Medio - 1), Valor, Posicion) ; else Bsqueda_Binaria (Tabla (Medio + 1 .. Ultimo), Valor, Posicion) ; end if; end Bsqueda_Binaria;

(16/Mayo/2004)

Qu es lo que sucedera?

(20) (10,20,)

First:2 First:1 First:1

Last:2 Last:2 Last:5

Valor : 20 Valor : 20 Valor : 20

Pos:2 Pos:2 Pos:2

(10,20,30,40)

A la ida de la recursividad pasaremos el valor que buscamos la posicin del primero y la posicin de medio-1. Cuando se encuentra el valor buscado (vuelta de la recursividad) se va vaciando la pila con la posicin en la que se encuentra el valor buscado. Hacer el ejercicio el problema iterativo Resultado := 0; for I in 1 .. 100 loop Resultado := Resultado + I; end loop; de forma recursiva. procedure Programa is Resultado := Integer := 0;

Programacin. Tema 5: Recursividad


procedure Calcula (I : in Integer Resultado : in out Integer) is begin -- Condicin de parada if I > 100 then return; end if; Resultado := Resultado + 1; Calcula (I + 1, Resultado); end Calcula; begin Calcula (1, Resultado) end Programa;

(16/Mayo/2004)

Procedimiento que de la vuelta a una lista. Lo haremos solo cambiando los punteros. procedure Invertir_Lista (Lista : in out T_Lista) is procedure Invertir (Anterior, Actual : T_Nodo_Ptr) is begin if Actual /= null then Lista.Primero := Anterior; return; end if; Invertir (Actual, Actual.Siguiente); Actual.Siguiente := Anterior; end Invertir; begin if Lista.Primero = null then return; end if; Invertir (null, Lista.Primero); end Invertir;

Das könnte Ihnen auch gefallen