RECURSIVIDAD
Recursividad
♦ Objetivos del alumno:
 
♦ 1.       Comprender el concepto de Recursividad
♦ 2.       Diferenciar entre la Directa e Indirecta
♦ 3.       Conocer el funcionamiento interno
♦ 4. Desarrollar algoritmos recursivos
Recursividad
♦ Un objeto es recursivo, si en parte esta
formado por si mismo o se define en función
de sí mismo.
♦ Dícese de lo que vuelve a ocurrir o aparecer,
especialmente después de un intervalo.
♦ En la vida diaria podemos encontrar procesos
o estados recursivos (loops): televisión,
acoplamiento o afinamiento musical, ajedrez,
dos espejos frente a frente.
Recursividad: Ejemplos
♦ Números naturales
♦ • 1 es un número natural
♦ • El sucesor de un número natural es otro número natural
♦ Estructuras de árbol
♦ • Un nodo vacío es un árbol:
• Si A1
y A2
son árboles, entonces
Nodo
vacío
A1 A2
Recursividad: Ejemplos
♦ Función factorial n!
♦ • 0! =1
♦ • Si n>0, entonces n!=n*(n-1)!
n n!
0 1
1 1
2 2
3 6
4 24
5 120
EL PODER DE LA RECURSIVIDAD
ES LA DEFINICIÓN DE UN
CONJUNTO INFINITO DE OBJETOS
MEDIANTE UNA PROPOSICIÓN FINITA.
Tipos de recursividad
♦ Directa:
 Procedure Directa ( ... );
begin
.
.
.
Directa ( ... );
.
.
.
end;
♦ Indirecta:
 Procedure Indirecta ( ... );
begin
.
.
.
A ( ... );
.
.
.
end;
 
Procedure A ( ... );
begin
.
.
.
Indirecta ( ... );
.
.
.
end;
Funcionamiento Interno
. . .
Proced./Func. Proced./Func. Proced./Func.
Llamado
recursivo
Puntos importantes en
recursividad
• Condición de parada
• Parámetros que se pasan en cada llamada
• Marcha atrás (backtracking)
• Consumo de memoria
Función factorial
Función Factorial:
 
Formulación
Función Factorial ( n! ) para enteros no negativos:
0! = 1
si n > 0 entonces n! = n *
( n - 1 )!
 
Programa
Program Factorial;
Const n = 8;
 
Function Fact ( N: Integer ): Integer;
begin
if N = 0 then Fact := 1
else Fact := N *
Fact ( n - 1 )
end;
begin
writeln ( Fact ( N ) )
end.
Función potencial
♦ Función Potencia:
♦  
♦ Formulación:
♦ Función Potencia ( an
) de exponente no negativo:
♦ a0
= 1
♦ si n > 0 entonces an
= a *
an - 1
♦ Pot(10,5)=100000
♦  
♦ Programa
♦ Program Potencia;
♦ Const base = 5;
♦ n = 10;
♦ Function Pot ( a, N: Integer );
♦ begin
♦ if N = 0 then Pot := 1
♦ else Pot := a * Pot ( a, N - 1 );
♦ end;
♦ begin
♦ writeln( Pot ( base, n ) )
♦ end.
Función Torres de Hanoi
♦ Tarea próxima clase - 10 puntos
♦ Con tres discos
♦ Con 4 discos
Solución Torres de Hanoi
Función Torres de Hanoi:
 
Formulación:
Nunca una ficha más ancha encima de otra más estrecha!.
 
Program Hanoi;
var NFichas, PaloI, PaloF: Integer;
 
Procedure Mover ( NFichas, PaloI, PaloF: Integer);
begin
if NFichas = 1 then
begin
writeln ( 'Mover de ',nfichas,' ', PaloI, ' a ', PaloF );
end
else
begin
Mover ( NFichas - 1, PaloI, 6 - PaloI - PaloF );
writeln ( 'Mover de ',nfichas,' ', PaloI, ' a ', PaloF );
Mover ( NFichas - 1, 6 - PaloI - PaloF, PaloF )
end
end;
 
begin (* Hanoi *)
repeat
writeln;
writeln ( 'Introducir el n£mero de fichas(ingrese 0 para salir): ');
read ( NFichas );
if nfichas<>0 then
begin
PaloI := 1; PaloF := 3;
Mover ( Nfichas, PaloI, PaloF )
end
until (NFichas=0);
end.
ARBOL DE TORRES DE HANOI CON 3 DISCOS
 
Nfichas=3 (A,B,C)
Mover(nficha,PosIniDisco,PosFinDisco)
Diagrama o árbol de llamadas recursivas
del procedimiento mover
Mover(3,1,3)
Mover(2,1,2) Mover(2,1,2)
Mover(2,2,3)Mover(1,1,3) Mover(1,3,2) Mover(2,2,3)
PALOS
1 2 3
A
B
C
   
B
C
  A
C B A
C A
B
 
  A
B
C
    B
C
    A
B
C
ARBOL DE TORRES DE HANOI CON 3 DISCOS
 
Nfichas=4 (A,B,C,D)
Mover(nficha,PosIniDisco,PosFinDisco)
Diagrama o árbol de llamadas recursivas
del procedimiento mover
Mover(4,1,3)
Mover(3,1,2) Mover(3,2,3)
Mover(2,1,3)Mover(2,1,3) Mover(2,3,2) Mover(2,2,1)
Mover(1,1,2)Mover(1,1,2) Mover(1,2,3) Mover(1,3,1)
Mover(1,2,3)
Mover(1,2,3) Mover(1,3,1)
Mover(1,1,2)
PALOS
1 2 3
A
B
C
D
   
B
C
D
 
 
A
 
C
D
 
A
 
B
C
D
 
 
A
B
 
D
 
C
A
B
A
B
 
C
 
B
A
D
B
C
 
 
 
D
A
B
C
 
  A
B
C
 
 
D
  B
C
A
D
 
B
 
C
A
D
A
B
 
C
 
D
A
B
  C
D
B A C
D
  A B
C
D
    A
B
C
D
BACK TRACKING
Back Tracking
♦ El back-tracking permite determinar las
soluciones de problemas específicos
sin seguir una regla fija de calculo sino
que se realiza por medio de una
experimentación, ensayo y error.
Back Tracking: Ejemplos
♦ Problemas que nos interesa resolverlos, sin
importar cuanto tiempo se tarde
♦ Poner n reinas en un tablero de ajedrez de
n x n posiciones, sin que se ataquen.
♦ Que el caballo de ajedrez recorra todas las
posiciones de un tablero de n x n, sin pasar o
ubicarse dos veces o más en una
determinada casilla.
♦ Problemas de estabilidad.
♦ Solución optima.
♦ El juego del solitario.
Las reinas
N reinas en tablero de n*n
http://www.scdi.org/%7eavernet/projects/jaskell/queens/
Problema de las 8 reinas
http://www.pvv.ntnu.no/~hgs/java/queens/simple.html
http://csc.uis.edu/~beamon/csc485/assign1/chess.html
http://perso.club-internet.fr/matuli/matthieu/jeux/eigthqueens/eigthqueens.htm
Pseudo código
program reinas;
var
i: integer
q:boolean
a: array [1..8] of boolean:
b: array [2..16] of boolean;
c: array [-7..7] of boolean;
x: array [1..8] of integer;
procedure posiciones (i:integer;var q: boolean);
var
j: integer;
begin
j:=0;
repeat
j:=j+1;
q:=false;
if a[j]=true and b[i+j] and c[i-j] then
x[i]:=j;
a[j]:=false;
b[i+1]:=false;
c[i-j]:=false;
if i<8 then
posiciones(i+1,q)
if q=false then
a[i]:=true;
b[i+j]:=true;
c[i-j]:=true
end
else
q:=true
end
end
until q or (j=8)
begin
for i:=1 to 8 do a[i]:=true end;
for i:=2 to 16 do b[i]:=true end;
for i:=-7 to 7 do c[i]:=true end;
posiciones(1,q);
for i:=1 to 8 do writeln (x[i]) end;
writeln;
end reinas
Para n reinas
program todasreinas;
var
i: integer;
q:boolean;
a: array [1..8] of boolean;
b: array [2..16] of boolean;
c: array [-7..7] of boolean;
x: array [1..8] of integer;
 
procedure imprimir;
var k:integer;
begin
for k:=1 to 8 do
write(x[k]);
writeln;
end;
 
procedure posiciones (i:integer);
var
j: integer;
begin
for j:=1 to 8 do
begin
if a[j] and b[i+j] and c[i-j] then
begin
x[i] :=j;
a[j] :=false;
b[i+j]:=false;
c[i-j]:=false;
if i<8 then
begin
posiciones(i+1);
end
else
begin
imprimir;
end;
 
a[j] :=true;
b[i+j]:=true;
c[i-j]:=true;
x[i] := 0;
end
end
end;
 begin
 
for i:=1 to 8 do
begin
a[i]:=true;
end;
 
for i:=2 to 16 do
begin
b[i]:=true;
end;
 
for i:=-7 to 7 do
begin
c[i]:=true;
end;
 
posiciones(1);
 
writeln;
end.
Arbol 8 reinas
Posiciones(4,true)
Posiciones(1,true)
Posiciones(1,true)
Posiciones(5,true)
Posiciones(8,true)
Posiciones(6,true)
Posiciones(3,true)
Posiciones(7,true)
Posiciones(2,true)
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Links Back Tracking
http://www.terra.es/personal/gerena/Applets/Caballo/Caballo.html
http://personal2.redestb.es/d-aa/Cap22.html
http://www.sistema.itesm.mx/va/Planes90/Sinteticos/Analiticos/Cb90092
.htmlç
http://www.puc.cl/curso_dist/dmw/complem/hitex_c4.html
http://www-azc.uam.mx/enlinea2/num2/2-1.htm
http://eb0.ciateq.mx/~centeno/AnalisisAlgoritmos.html
http://eb0.ciateq.mx/~centeno/Docs/Hi_q.ppt
http://web.jet.es/jqc/progii1.html
http://web.jet.es/jqc/progii5.html
http://www.lemaco.hn/educa/program/recursividad/RECUR1_1.html
Matrimonio Estabilidad
♦ Tarea: Estudiar el caso del matrimonio estable
para control próxima clase.

3 recursividad

  • 1.
  • 2.
    Recursividad ♦ Objetivos delalumno:   ♦ 1.       Comprender el concepto de Recursividad ♦ 2.       Diferenciar entre la Directa e Indirecta ♦ 3.       Conocer el funcionamiento interno ♦ 4. Desarrollar algoritmos recursivos
  • 3.
    Recursividad ♦ Un objetoes recursivo, si en parte esta formado por si mismo o se define en función de sí mismo. ♦ Dícese de lo que vuelve a ocurrir o aparecer, especialmente después de un intervalo. ♦ En la vida diaria podemos encontrar procesos o estados recursivos (loops): televisión, acoplamiento o afinamiento musical, ajedrez, dos espejos frente a frente.
  • 4.
    Recursividad: Ejemplos ♦ Númerosnaturales ♦ • 1 es un número natural ♦ • El sucesor de un número natural es otro número natural ♦ Estructuras de árbol ♦ • Un nodo vacío es un árbol: • Si A1 y A2 son árboles, entonces Nodo vacío A1 A2
  • 5.
    Recursividad: Ejemplos ♦ Funciónfactorial n! ♦ • 0! =1 ♦ • Si n>0, entonces n!=n*(n-1)! n n! 0 1 1 1 2 2 3 6 4 24 5 120 EL PODER DE LA RECURSIVIDAD ES LA DEFINICIÓN DE UN CONJUNTO INFINITO DE OBJETOS MEDIANTE UNA PROPOSICIÓN FINITA.
  • 6.
    Tipos de recursividad ♦Directa:  Procedure Directa ( ... ); begin . . . Directa ( ... ); . . . end; ♦ Indirecta:  Procedure Indirecta ( ... ); begin . . . A ( ... ); . . . end;   Procedure A ( ... ); begin . . . Indirecta ( ... ); . . . end;
  • 7.
    Funcionamiento Interno . .. Proced./Func. Proced./Func. Proced./Func. Llamado recursivo
  • 8.
    Puntos importantes en recursividad •Condición de parada • Parámetros que se pasan en cada llamada • Marcha atrás (backtracking) • Consumo de memoria
  • 9.
    Función factorial Función Factorial:   Formulación FunciónFactorial ( n! ) para enteros no negativos: 0! = 1 si n > 0 entonces n! = n * ( n - 1 )!   Programa Program Factorial; Const n = 8;   Function Fact ( N: Integer ): Integer; begin if N = 0 then Fact := 1 else Fact := N * Fact ( n - 1 ) end; begin writeln ( Fact ( N ) ) end.
  • 10.
    Función potencial ♦ FunciónPotencia: ♦   ♦ Formulación: ♦ Función Potencia ( an ) de exponente no negativo: ♦ a0 = 1 ♦ si n > 0 entonces an = a * an - 1 ♦ Pot(10,5)=100000 ♦   ♦ Programa ♦ Program Potencia; ♦ Const base = 5; ♦ n = 10; ♦ Function Pot ( a, N: Integer ); ♦ begin ♦ if N = 0 then Pot := 1 ♦ else Pot := a * Pot ( a, N - 1 ); ♦ end; ♦ begin ♦ writeln( Pot ( base, n ) ) ♦ end.
  • 11.
    Función Torres deHanoi ♦ Tarea próxima clase - 10 puntos ♦ Con tres discos ♦ Con 4 discos
  • 12.
    Solución Torres deHanoi Función Torres de Hanoi:   Formulación: Nunca una ficha más ancha encima de otra más estrecha!.   Program Hanoi; var NFichas, PaloI, PaloF: Integer;   Procedure Mover ( NFichas, PaloI, PaloF: Integer); begin if NFichas = 1 then begin writeln ( 'Mover de ',nfichas,' ', PaloI, ' a ', PaloF ); end else begin Mover ( NFichas - 1, PaloI, 6 - PaloI - PaloF ); writeln ( 'Mover de ',nfichas,' ', PaloI, ' a ', PaloF ); Mover ( NFichas - 1, 6 - PaloI - PaloF, PaloF ) end end;   begin (* Hanoi *) repeat writeln; writeln ( 'Introducir el n£mero de fichas(ingrese 0 para salir): '); read ( NFichas ); if nfichas<>0 then begin PaloI := 1; PaloF := 3; Mover ( Nfichas, PaloI, PaloF ) end until (NFichas=0); end.
  • 13.
    ARBOL DE TORRESDE HANOI CON 3 DISCOS   Nfichas=3 (A,B,C) Mover(nficha,PosIniDisco,PosFinDisco) Diagrama o árbol de llamadas recursivas del procedimiento mover Mover(3,1,3) Mover(2,1,2) Mover(2,1,2) Mover(2,2,3)Mover(1,1,3) Mover(1,3,2) Mover(2,2,3) PALOS 1 2 3 A B C     B C   A C B A C A B     A B C     B C     A B C
  • 14.
    ARBOL DE TORRESDE HANOI CON 3 DISCOS   Nfichas=4 (A,B,C,D) Mover(nficha,PosIniDisco,PosFinDisco) Diagrama o árbol de llamadas recursivas del procedimiento mover Mover(4,1,3) Mover(3,1,2) Mover(3,2,3) Mover(2,1,3)Mover(2,1,3) Mover(2,3,2) Mover(2,2,1) Mover(1,1,2)Mover(1,1,2) Mover(1,2,3) Mover(1,3,1) Mover(1,2,3) Mover(1,2,3) Mover(1,3,1) Mover(1,1,2) PALOS 1 2 3 A B C D     B C D     A   C D   A   B C D     A B   D   C A B A B   C   B A D B C       D A B C     A B C     D   B C A D   B   C A D A B   C   D A B   C D B A C D   A B C D     A B C D
  • 15.
  • 16.
    Back Tracking ♦ Elback-tracking permite determinar las soluciones de problemas específicos sin seguir una regla fija de calculo sino que se realiza por medio de una experimentación, ensayo y error.
  • 17.
    Back Tracking: Ejemplos ♦Problemas que nos interesa resolverlos, sin importar cuanto tiempo se tarde ♦ Poner n reinas en un tablero de ajedrez de n x n posiciones, sin que se ataquen. ♦ Que el caballo de ajedrez recorra todas las posiciones de un tablero de n x n, sin pasar o ubicarse dos veces o más en una determinada casilla. ♦ Problemas de estabilidad. ♦ Solución optima. ♦ El juego del solitario.
  • 18.
    Las reinas N reinasen tablero de n*n http://www.scdi.org/%7eavernet/projects/jaskell/queens/ Problema de las 8 reinas http://www.pvv.ntnu.no/~hgs/java/queens/simple.html http://csc.uis.edu/~beamon/csc485/assign1/chess.html http://perso.club-internet.fr/matuli/matthieu/jeux/eigthqueens/eigthqueens.htm
  • 19.
    Pseudo código program reinas; var i:integer q:boolean a: array [1..8] of boolean: b: array [2..16] of boolean; c: array [-7..7] of boolean; x: array [1..8] of integer; procedure posiciones (i:integer;var q: boolean); var j: integer; begin j:=0; repeat j:=j+1; q:=false; if a[j]=true and b[i+j] and c[i-j] then x[i]:=j; a[j]:=false; b[i+1]:=false; c[i-j]:=false; if i<8 then posiciones(i+1,q) if q=false then a[i]:=true; b[i+j]:=true; c[i-j]:=true end else q:=true end end until q or (j=8) begin for i:=1 to 8 do a[i]:=true end; for i:=2 to 16 do b[i]:=true end; for i:=-7 to 7 do c[i]:=true end; posiciones(1,q); for i:=1 to 8 do writeln (x[i]) end; writeln; end reinas
  • 20.
    Para n reinas programtodasreinas; var i: integer; q:boolean; a: array [1..8] of boolean; b: array [2..16] of boolean; c: array [-7..7] of boolean; x: array [1..8] of integer;   procedure imprimir; var k:integer; begin for k:=1 to 8 do write(x[k]); writeln; end;   procedure posiciones (i:integer); var j: integer; begin for j:=1 to 8 do begin if a[j] and b[i+j] and c[i-j] then begin x[i] :=j; a[j] :=false; b[i+j]:=false; c[i-j]:=false; if i<8 then begin posiciones(i+1); end else begin imprimir; end;   a[j] :=true; b[i+j]:=true; c[i-j]:=true; x[i] := 0; end end end;  begin   for i:=1 to 8 do begin a[i]:=true; end;   for i:=2 to 16 do begin b[i]:=true; end;   for i:=-7 to 7 do begin c[i]:=true; end;   posiciones(1);   writeln; end.
  • 21.
  • 22.
  • 23.
    Matrimonio Estabilidad ♦ Tarea:Estudiar el caso del matrimonio estable para control próxima clase.