Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
7. Los alumnos que obtienen una nota final promedio (de las 4 notas)
de 6 o mayor a 6 tendrn aprobada la promocin.
8. Los alumnos que obtienen una nota final promedio (de las 4 notas)
de 4 o mayor a 4 y menor que 6 tendrn aprobada la cursada y
debern rendir examen final.
Programacin II Materiales
Deben solicitar inscripcin en el curso Programacin II, donde
el profesor es Alejandro Gonzlez en WebUNLP desde
http://webunlp.ead.unlp.edu.ar
RECURSION
Temario - Recursin
Concepto de Recursin
Caractersticas de algoritmos recursivos
Ejemplos
JUEGO
Se trata de un juego con discos de radio creciente que se apilan insertndose en una
de las tres estacas de un tablero.
El objetivo del juego es crear la pila en otra de las estacas.
Las reglas son:
1. Slo se puede mover un disco cada vez.
2. Un disco de mayor tamao no puede descansar sobre uno ms pequeo que l
mismo.
3. Slo se puede desplazar el disco que se encuentre arriba en cada varilla.
Qu es la recursin?
Vamos a mirar el siguiente video.
http://www.youtube.com/watch?v=aGlt2G-DC8c
las
siguientes
RECURSION
RECURSION Concepto
Una solucin recursiva resuelve un problema
por resolucin de instancias ms pequeas del
mismo problema y hay un caso especial.
Suponga que
quiere resolver
el problema de
contar cuantas
monedas hay
en una pila de
monedas
cant=0
while (hay monedas en la pila) do
cuento una ms (cant + 1)
saco una moneda de la pila
Cmo se piensa una solucin recursiva?
RECURSION - Caractersticas
Toda solucin recursiva tiene:
un caso base o degenerado
el problema es el mismo
pero de menor tamao
Caso
base?
RECURSION Ejemplo 1
Observaciones importantes:
Se llama a s mismo.
En cada llamada el tamao el problema se achica
(la pila disminuye).
Existe un caso distinto que se resuelve de manera
particular y directa (sin recursin).
RECURSION Ejemplo 1
Formalicemos un poco mas el algoritmo
Dnde se inicializa
cant?
Cmo se ejecuta un
mdulo recursivo?
RECURSION Ejemplo 1
Pensemos en una pila que no sabemos cuantos elementos puede
tener
Qu estructura de datos la puede representar?
Lista
RECURSION Ejemplo 1
Agrego por el frente, (puntero al primero)
Lista
RECURSION Ejemplo 1
Programa recursivo;
Procedure cuenta (P:pila; var cant:integer);
Begin
if (la pila P tiene monedas) then
begin
cant:= cant + 1;
<sacar una moneda de la pila P>
cuenta (P,cant);
end;
Var
cantidad:integer; P:pila
Begin
cargarPila(P); cantidad:=0;
cuenta (P, cantidad);
End.
Programa secuencial;
Procedure cuenta (P:pila; var cant:integer);
Begin
while (la pila P tiene monedas) do
begin
cant:= cant + 1;
<sacar una moneda de la pila P>
end;
end;
Var
cantidad:integer; P:pila
Begin
cargarPila(P); cantidad:=0;
cuenta (P, cantidad);
End.
RECURSION Ejemplo 1
Programa recursivo;
Procedure cuenta (P:pila; var
cant:integer);
Begin
if (la pila P tiene monedas) then
begin
cant:= cant + 1;
<sacar una moneda de la pila P>
cuenta (P, cant);
end;
Var
cantidad:integer; P:pila
Begin
cargarPila(P); cantidad:=0;
cuenta (P, cantidad);
End.
Programa secuencial;
Procedure cuenta (P:pila; var cant:integer);
Begin
cant:=0;
while (la pila P tiene monedas) do
begin
cant:= cant + 1;
<sacar una moneda de la pila P>
end;
end;
Var
cantidad:integer; P:pila
Begin
cargarPila(P);
cuenta (P, cantidad);
End.
Implementacin recursiva
Program Recursivo;
Type pila = ^listap;
listap = record
valor: integer;
sig: pila;
end;
Procedure cuenta (P:pila; var
cant:integer);
Begin
if (P <> nil) then
begin
cant:= cant + 1;
P:= P^.sig;
cuenta (P, cant);
end;
Var
cantidad:integer; P:pila
Begin {del programa principal}
cargarPila(P); cantidad:=0;
cuenta (P, cantidad);
End.
Cmo funciona la recursin
en memoria RAM?
RECURSION - Definicin
Una solucin para ser recursiva debe cumplir con que:
1. El problema debe resolverse en instancias del mismo
problema
2. En cada llamado debe reducirse el espacio de
solucin del problema
3. Debe existir un caso base o degenerado que se
resuelve sin recursin.
RECURSION Ejemplo 2
Suponga que se quiere calcular el factorial de un nmero
Solucin secuencial
function factorial
(n:integer):integer;
Var
i,fac:integer;
Begin
fac:=1;
for i:= n downto 2 do
fac:= fac*i;
factorial:= fac;
End;
Solucin recursiva
function factorial (n:integer):integer;
Var
Caso
i,fac:integer;
base?
Begin
1
si N<=1
N!
N*(N-1)!
End;
si N>1
RECURSION Ejemplo 2
Probar cdigo en lena en http://ideone.com