Академический Документы
Профессиональный Документы
Культура Документы
Industrial (Electricidad)
Tema 3. Recursividad.
Diseo de Algoritmos.
E.U. Politcnica Departamento Lenguajes y Ciencias de la Computacin. Universidad de Mlaga Jos Luis Leiva Olivencia. Despacho: I-326D (Edificio E.U.P)/ 3.2.41 (Teatinos-E.T.S.I.I.)
Elementos de Programacin I
Introduccin
Definicin de Recursividad: Tcnica de programacin muy potente que puede ser usada en lugar de la iteracin, consistente en la invocacin de un algoritmo a s mismo. Ambito de Aplicacin:
General. Problemas cuya solucin se puede hallar solucionando el mismo problema pero con un caso de menor tamao.
Razones de uso:
Problemas ms fciles de resolver que con estructuras iterativas. Soluciones elegantes. Soluciones ms simples.
Elementos de Programacin I
Introduccin
En qu consiste la recursividad?
En el cuerpo de sentencias del subalgoritmo se invoca al propio subalgoritmo para resolver una versin ms pequea del problema original.
Elementos de Programacin I
Introduccin
Ejemplo: Factorial de un natural. 1 si n=0 Factorial(n)= n*Factorial(n-1) si n>0 int Factorial(int n) { if (n==0) return 1; else return (n*Factorial(n-1)); }
Elementos de Programacin I
Introduccin
El mtodo de definicin de una funcin en trminos de s misma se llama en matemticas a una definicin inductiva y conduce naturalmente a una implementacin recursiva. El caso base de 0!=1 es esencial dado que se detiene, potencialmente, una cadena de llamadas recursivas (Caso Base o condicin de salida)
Departamento de Lenguajes y Ciencias de la Computacin
Elementos de Programacin I
Introduccin
Tipos de recursividad:
Si una funcin o procedimiento se invoca a s misma, el proceso se denomina recursin directa; si una funcin o procedimiento puede invocar a una segunda funcin o procedimiento que a su vez invoca a la primera este proceso se conoce como recursin indirecta o mutua.
Elementos de Programacin I
Introduccin
24
F(4)=4 * F(3)
6 2 1
F(1)=1 * F(0)
Departamento de Lenguajes y Ciencias de la Computacin
Elementos de Programacin I
Introduccin
Registro de Activacin. bloque de memoria que contiene la informacin sobre las constantes y variables declaradas en el procedimiento, junto con una direccin de retorno, direccin en memoria de la sentencia que caus la llamada al subalgoritmo. Direccin de Retorno. Pila (Stack) Forma especial de organizar la memoria, en la que la informacin siempre se aade y se suprime por una posicin llamada cima . Vinculacin(direccin memoria variable).
Departamento de Lenguajes y Ciencias de la Computacin
Elementos de Programacin I
Elementos de Programacin I
Elementos de Programacin I
Subprograma 2
Subprograma 1
Elementos de Programacin I
Elementos de Programacin I
Asignacin de cada variable, parmetro relativa a una posicin (CAB) En este caso: x 1 y 2 z 3 Direccin de retorno0
Elementos de Programacin I
Tiempo de ejecucin:Se ejecucin:Se reserva espacio para las variables y parmetros a partir de la situacin actual de CAB
34 33 32 31 30 29 28 27 Memoria Cab
Situacion 1
Elementos de Programacin I
Memoria
Elementos de Programacin I
Stack
Elementos de Programacin I
Ejemplo con la funcin factorial int Factorial(int n) { if (n==0) return 1; else return(n*Factorial(n-1);) } La invocacin inicial es: R2 Resultado = Factorial(3) Departamento de Lenguajes y Ciencias de la Computacin R1
Elementos de Programacin I
Elementos de Programacin I
Invocacin del subalgoritmo a s mismo. Cada llamada al subalgoritmo se realiza con un valor de parmetro que hace el problema de menor tamao. La llamada al subalgoritmo se realiza siempre en una sentencia de seleccin. En dicha sentencia de seleccin, al menos debe de haber un caso donde se acta de forma diferente (no recursiva).Este es el caso base. Ocultacin de los detalles de gestin de la memoria en las llamadas recursivas (Pila interna).
Departamento de Lenguajes y Ciencias de la Computacin
Elementos de Programacin I
Elementos de Programacin I
Obtencin de una definicin exacta del problema Resolver el(los) casos bases o triviales (no recursivos). Determinar el tamao del problema completo que hay que resolver Parmetros en la llamada inicial Resolver el caso general en trminos de un caso ms pequeo (llamada recursiva).
Distintos parmetros
Elementos de Programacin I
Ejemplos
Combinaciones:cuntas combinaciones de cierto tamao pueden hacerse de un grupo total de elementos?
C:nmero total de combinaciones Grupo:tamao total del grupo del que elegir Miembros:tamao de cada subgrupo Grupo>=Miembros
-Grupo si Miembros=1
Elementos de Programacin I
Ejemplos
FUNCIN COMBINACIONES
Definicin:Calcular cuantas combinaciones de tamao Miembros pueden hacerse del tamao total Grupo Tamao:Nmero de elementos en la llamada original Casos-base:1)Miembros=1 Combinaciones=Grupo 2)Miembros=Grupo Combinaciones=1 Caso General:Grupo>Miembros>1
Combinaciones = Combinaciones(Grupo-1 , Miembros -1)+Combinaciones( Grupo-1, Miembros)
Elementos de Programacin I
Ejemplos
int Comb(int Grupo,int Miembros) { if (Miembros==1) return Grupo;/*Caso Base 1*/ else if (Miembros==Grupo) ENTONCES return 1; /*Caso Base 2*/ else (*Caso General*) return (Comb(Grupo-1,Miembros-1) +Comb(Grupo-1,Miembros)); }
Elementos de Programacin I
Ejemplos
Seguimiento de Comb(4,3)
Comb(4,3)
Comb(3,2)
+
Comb(2,2) 1
Comb(3,3)
Comb(2,1) 2
+ +
=4
Elementos de Programacin I
Ejemplos
FUNCIN FIBONACCI
Definiciones:Calcular el valor de la funcin de Fibonacci para un nmero n dado. Tamao:Nmero n de la llamada original Casos-base:n<=2 fib=1 Caso General:n>2 fib(n)=fib(n-1)+fib(n-2)
Elementos de Programacin I
Ejemplos
int Fib(int n) { if (n <= 2) return 1; else return ((Fib(n-1)+Fib(n-2)); }
Departamento de Lenguajes y Ciencias de la Computacin
Elementos de Programacin I
Ejemplos
Seguimiento de Fib(4)
Fib(4)
Fib(3)
+
Fib(1) 1
Fib(2)
Fib(2) 1
+ +
=3
Elementos de Programacin I
Ejemplos
Imprimir el equivalente binario de un nmero decimal N 23 11 5 2 1 0 N MOD 2 1 1 1 0 1 N/2 11 5 2 1 0
Elementos de Programacin I
Ejemplos
N Bin de N=
Si N<2
Elementos de Programacin I
Ejemplos
void DecimalAbinario(int num) { if (num>=2) { DecimalABinario(num/2); printf(%d,num%2); } else printf(%d,num); }
Departamento de Lenguajes y Ciencias de la Computacin
Elementos de Programacin I
Recursin o iteracin?
Se puede utilizar la recursividad como una alternativa a la iteracin. Una solucin recursiva es normalmente menos eficiente en trminos de tiempo de computadora que una solucin iterativa debido a las operaciones auxiliares que llevan consigo las llamadas suplementarias a las funciones. La solucin recursiva muchas veces permite a los programadores especificar soluciones naturales, que en otros casos sera difcil de resolver.
Departamento de Lenguajes y Ciencias de la Computacin
Elementos de Programacin I
Recursin o iteracin?
Ventajas de la Recursin ya conocidas
Soluciones simples, claras. Soluciones elegantes. Soluciones a problemas complejos.
Elementos de Programacin I
Recursin o iteracin ?
A veces, podemos encontrar una solucin iterativa simple, que haga que el algoritmo sea ms eficiente.
int Fib(int n) { int R, R1, R2, i; R1 1; R2 1; R 1 for (i=3;i<=n;i++) { R R1 + R2 R2 R1 R1 R } return r; } Departamento de Lenguajes y Ciencias de la Computacin
Elementos de Programacin I
Recursin o iteracin?
LA RECURSIVIDAD SE DEBE USAR CUANDO SEA REALMENTE NECESARIA, ES DECIR, CUANDO NO EXISTA UNA SOLUCIN ITERATIVA SIMPLE. CUANDO LAS DOS SOLUCIONES SON FACILMENTE EXPRESABLES, SIEMPRE SOLUCIN ITERATIVA.
Departamento de Lenguajes y Ciencias de la Computacin
Elementos de Programacin I
Recursin o iteracin?
Evitar la utilizacin de la recursividad en situaciones de rendimiento crtico o exigencia de altas prestaciones en tiempo y memoria, ya que las llamadas recursivas emplean tiempo y consumen memoria adicional.
Elementos de Programacin I
Depuracin
ERRORES COMUNES Tendencia a usar estructuras iterativas en lugar de estructuras selectivas. El algoritmo no se detiene.
Comprobarel eluso usode deSI SIo o Comprobar CASO CASO
Elementos de Programacin I
Ejemplos
BUSQUEDA EN UN ARRAY
Funcin ValorEnLista:Buscar el valor Val en un arrayLista:TLista ValorEnLista arrayLista:TLista Solucin recursiva RESULTADO (Val en 1 posicin) (Val en resto del ARRAY) Para buscar en el resto del ARRAY, uso la misma funcin ValorEnLista
...
(1) (2) (Inicio) (inicio+1) (Fin)
Elementos de Programacin I
Ejemplos
Funcin /*1 si lo encuentra 0 en caso contrario*/
int ValorEnLista(TLista l,Tvalor valor,int Inicio, int Fin);
Invocacin: SI ValorEnLista(Lista,Val,1,MaxLista) ENTONCES.... Casos Base: Lista[Inicio]==Val return 1; (Inicio==Fin) && (Lista[Inicio] != Val) return 0; Caso General:buscar en el resto del ARRAY return (ValorEnLista(Lista,Val,Inicio+1,Fin));
Elementos de Programacin I
Ejemplos
int ValorEnLista(TLista l,Tvalor valor,int Inicio, int Fin) (*Busca recursiva en lista de Valor
dentro del rango del indice del ARRAY*) if (l[Inicio]==valor) return 1; else if(Inicio==Fin) return 0; else
return (ValorEnLista(l,valor,Inicio+1,Fin));
Elementos de Programacin I
Ejemplos
Torres de Hanoi
Algoritmo clsico cuyo origen oriental versa sobre una leyenda sobre el Templo de Brahma. Se tienen 3 palos de madera, que llamaremos palo izquierdo, central y derecho. El palo izquierdo tiene ensartados un montn de discos concntricos de tamao decreciente, de manera que el disco mayor est abajo y el menor arriba. El problema consiste en mover los discos del palo izquierdo al derecho respetando las siguientes reglas: - Slo se puede mover un disco cada vez. - No se puede poner un disco encima de otro ms pequeo. - Despus de un movimiento todos los discos han de estar en alguno de los tres palos. Leer por teclado un valor N, e imprimir la secuencia de pasos para resolver el Departamento de Lenguajes y Ciencias de la Computacin problema. Elementos de Programacin I
Ejemplos
A B C
Elementos de Programacin I
Ejemplos
A B C
Elementos de Programacin I
Ejemplos
Solucin recursiva a las Torres de Hanoi Si n=1 mueva el disco de A a C y pare Mueva los n-1 discos superiores de A a B, con C auxiliar Mueva el disco restante de A a C Mueva los n-1 discos de B a C, usando A como auxiliar
Elementos de Programacin I
Ejemplos
Planteamos un procedimiento recursivo con cuatro parmetros:
- El nmero de discos a mover. - El palo origen desde donde moverlos. - El palo destino hacia el que moverlos. - El palo auxiliar.
void Mueve(int N,int origen,int auxiliar,int destino) { if (N==1) printf(Palo %d a palo %d\n,origen,destino) else { Mueve(N-1,origen,destino,auxiliar) printf(Palo %d a palo %d\n,origen,destino) Mueve(N-1,auxiliar,origen,destino) } }
Elementos de Programacin I
Ejemplos
ORDENACIN RPIDA (QUICKSORT)
A..Z
A..L
M..Z
A..F
G..L
Elementos de Programacin I
Ejemplos
Solucin recursiva a la ordenacin rpida.
V
1 12 2 13 3 4 5 6 7 8 9 10 11
Elementos de Programacin I
Ejemplos
El algoritmo bsico OrdRpida es:
SI terminado ENTONCES Dividir el array por un valor V (Pivote) OrdRpida los elementos menores iguales que V OrdRpida los elementos mayores que V PROC OrdRpida(Datos:Tarray,Primero,Ultimo:NATURAL) La llamada sera OrdRpida (Datos,1,n)
Elementos de Programacin I
Ejemplos
primero Punto divisin ltimo
V
1 12 2 13 3 4 5 6 7 8 9 10 11
V
6 7 8
>V 9 10 11
Elementos de Programacin I
Ejemplos
OrdRpida(Datos, Primero, PuntoDivisin-1) OrdRpida(Datos,Puntodivisin+1,Ultimo)
Elementos de Programacin I
Ejemplos
a) Inicializacin
9
V=Datos[1] =9
20 6 10 14 8 60 11
Dcha
11
Dcha
11
Izq
Dcha
Elementos de Programacin I
Ejemplos
d) Intercambiar Datos[Izq] y Datos[Dcha], y mover Izq y Dcha
9 8 6 10 14 20 60 11
Izq
Dcha
e) Mover Izq hasta que Datos[Izq]>V Dcha<Izq Mover Dcha hasta que Datos[Dcha]<=V Dcha<Izq
9 8 6 10 14 20 60 11
Dcha
Izq
f) Izq>Dcha, por tanto no ocurre ningn intercambio dentro del bucle . Intercambiamos Datos[1] con Datos[Dcha]
6 8 9 10 14 20 60 11
PuntoDivisin
Elementos de Programacin I
PROC Dividir( Datos:Tarray;Primero,Ultimo:ENTERO; Pdivision:ENTERO) VARIABLES Izq,Dcha,V:ENTERO Inicio VDatos[Primero] IzqPrimero+1 DchaUltimo REPETIR MIENTRAS(Izq<=Dcha) (Datos[Izq]<=V) HACER IzqIzq+1 FINMIENTRAS MIENTRAS (Izq<=Dcha) (Datos[Dcha]>V) HACER DchaDcha-1 FINMIENTRAS SI Izq<Dcha ENTONCES Intercambiar(Datos[Izq],Datos[Dcha]) IzqIzq+1 DchaDcha-1 FINSI HASTA (Izq>Dcha) Intercambiar(Datos[Primero],Datos[Dcha]) PdivisionDcha Fin