Beruflich Dokumente
Kultur Dokumente
Tema 5: Recursividad
(16/Mayo/2004)
(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
Qu es lo que sucedera?
Escribir A En la pantalla veramos Escribir L ALOH
Escribir O
Escribir H
(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)
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;
(16/Mayo/2004)
Qu es lo que sucedera?
(20) (10,20,)
(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;
(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;