Recursividad
Recursividad
Recursividad
Escuela de Ingenierı́a
Departamento de Ciencias de la Computación
01 de Junio, 2015
Clases pasadas Ejemplos Ejercicios Propuestos
Recursión
2
Clases pasadas Ejemplos Ejercicios Propuestos
Recursión
1 def funcion () :
2 funcion ()
3
4 funcion ()
3
Clases pasadas Ejemplos Ejercicios Propuestos
Recursión
1 def funcion () :
2 funcion ()
3
4 funcion ()
3
Clases pasadas Ejemplos Ejercicios Propuestos
Recursión
1 def funcion () :
2 funcion ()
3
4 funcion ()
3
Clases pasadas Ejemplos Ejercicios Propuestos
Recursión
4
Clases pasadas Ejemplos Ejercicios Propuestos
Recursión
5
Clases pasadas Ejemplos Ejercicios Propuestos
Recursión
Definición
Recursión es una estrategia para solucionar problemas llamando
a una función dentro de si misma.
6
Clases pasadas Ejemplos Ejercicios Propuestos
Recursión
Definición
Recursión es una estrategia para solucionar problemas llamando
a una función dentro de si misma.
Ventajas:
Códigos más cortos.
Códigos más legibles.
6
Clases pasadas Ejemplos Ejercicios Propuestos
Recursión
7
Clases pasadas Ejemplos Ejercicios Propuestos
Recursión
7
Clases pasadas Ejemplos Ejercicios Propuestos
Recursión
8
Clases pasadas Ejemplos Ejercicios Propuestos
Recursión
n! = n ∗ (n − 1)! 1! = 1 0! = 1
9
Clases pasadas Ejemplos Ejercicios Propuestos
Recursión
n! = n ∗ (n − 1)! 1! = 1 0! = 1
1 def factorial ( n ) :
2 if ( n <= 1) :
3 return 1
4 return n * factorial (n -1)
5
6 print ( factorial (5) )
9
Clases pasadas Ejemplos Ejercicios Propuestos
Recursión
10
Clases pasadas Ejemplos Ejercicios Propuestos
Recursión
11
Clases pasadas Ejemplos Ejercicios Propuestos
Recursión
1 def factorial ( n ) :
2 if ( n <= 1) :
3 return 1
4 return n * factorial (n -1)
12
Clases pasadas Ejemplos Ejercicios Propuestos
Ejemplos
13
Clases pasadas Ejemplos Ejercicios Propuestos
Ejemplos
1 def mystery (a , b ) :
2 if ( b == 0) : return 0
3 if ( b % 2 == 0) : return mystery ( a +a , b //2)
4 return mystery ( a +a , b //2) + a
14
Clases pasadas Ejemplos Ejercicios Propuestos
Ejemplos
15
Clases pasadas Ejemplos Ejercicios Propuestos
Ejemplos
1 def palindromo ( s ) :
2 if ( len ( s ) <= 1) :
3 return True
4 return ( s [0]== s [ -1]) and palindromo ( s [1: len ( s ) -1])
15
Clases pasadas Ejemplos Ejercicios Propuestos
Ejemplos
16
Clases pasadas Ejemplos Ejercicios Propuestos
Ejemplos
17
Clases pasadas Ejemplos Ejercicios Propuestos
Ejemplos
Ejemplos
1 def pintar_region (t , p ) :
2 c = t [ p [0]][ p [1]]
3 t [ p [0]][ p [1]] = 2
4 for d in [[1 ,0] ,[ -1 ,0] ,[0 ,1] ,[0 , -1]]:
5 di = p [0]+ d [0]
6 dj = p [1]+ d [1]
7 if (0 <= di < len ( t ) and
8 0 <= dj < len ( t [0]) and
9 t [ di ][ dj ] == c ) :
10 pintar_region (t ,[ di , dj ])
18
Clases pasadas Ejemplos Ejercicios Propuestos
Ejemplos
19
Clases pasadas Ejemplos Ejercicios Propuestos
Ejemplos
1 def verificar_suma (L , n ) :
2 if ( len ( L ) == 0) :
3 return n == 0
4 for i in range ( n // L [0] + 1) :
5 if ( verificar_suma ( L [1:] , n - i * L [0]) ) :
6 return True
7 return False
8
9 print ( verificar_suma ([5 , 3 , 9] ,7) ) # >>> False
10 print ( verificar_suma ([5 , 3 , 9] ,31) ) # >>> True
19
Clases pasadas Ejemplos Ejercicios Propuestos
Ejemplos
¿Cómo retorno los factores que hacen posible la multiplicación?
20
Clases pasadas Ejemplos Ejercicios Propuestos
Ejemplos
¿Cómo retorno los factores que hacen posible la multiplicación?
20
Clases pasadas Ejemplos Ejercicios Propuestos
Ejemplos
Paréntesis balanceados:
21
Clases pasadas Ejemplos Ejercicios Propuestos
Ejemplos
Paréntesis balanceados:
3 7
() ((
(())() )(
((())()) ((())((())
21
Clases pasadas Ejemplos Ejercicios Propuestos
Ejemplos
22
Clases pasadas Ejemplos Ejercicios Propuestos
Ejemplos
¿Cómo lo resolverı́an?
22
Clases pasadas Ejemplos Ejercicios Propuestos
Ejemplos
23
Clases pasadas Ejemplos Ejercicios Propuestos
Ejemplos
23
Clases pasadas Ejemplos Ejercicios Propuestos
Ejemplos
Problema:
¿Cómo hacemos S → SS?
No sabemos dónde cortar S...
24
Clases pasadas Ejemplos Ejercicios Propuestos
Ejemplos
Problema:
¿Cómo hacemos S → SS?
No sabemos dónde cortar S...
24
Clases pasadas Ejemplos Ejercicios Propuestos
Ejemplos
Problema:
¿Cómo hacemos S → SS?
No sabemos dónde cortar S...
24
Clases pasadas Ejemplos Ejercicios Propuestos
Ejemplos
1 def par ( s ) :
2 if ( s == " " ) :
3 return True
4 f = len ( s ) -1
5 if ( s [0] == " ( " and s [ f ] == " ) " and par ( s [1: f ]) ) :
6 return True
7 for i in range (1 , f ) :
8 if ( par ( s [: i ]) and par ( s [ i :]) ) :
9 return True
10 return False
25
Clases pasadas Ejemplos Ejercicios Propuestos
Ejemplos
Calculadora convencional:
26
Clases pasadas Ejemplos Ejercicios Propuestos
Ejemplos
Calculadora convencional:
Input Output
"3" 3
"(3+2)" 5
"((3+2)*5)" 25
"((3+2)*(5/2))" 12.5
26
Clases pasadas Ejemplos Ejercicios Propuestos
Ejemplos
S → d.
S → (S1 [op] S2).
27
Clases pasadas Ejemplos Ejercicios Propuestos
Ejemplos
S → d.
S → (S1 [op] S2).
¿Cómo lo resolverı́an?
27
Clases pasadas Ejemplos Ejercicios Propuestos
Ejemplos
28
Clases pasadas Ejemplos Ejercicios Propuestos
Ejemplos
28
Clases pasadas Ejemplos Ejercicios Propuestos
Ejemplos
29
Clases pasadas Ejemplos Ejercicios Propuestos
Ejemplos
29
Clases pasadas Ejemplos Ejercicios Propuestos
Ejemplos
Algoritmo:
Recorrer S de izquierda a derecha (sin considerar primer
paréntesis).
Si veo un "(" sumo 1 a un contador.
Si veo un ")" resto 1 a un contador.
Si veo un operador y el contador es 0, entonces esa es la
posición buscada.
29
Clases pasadas Ejemplos Ejercicios Propuestos
Ejemplos
30
Clases pasadas Ejemplos Ejercicios Propuestos
Ejemplos
1 def calcular ( s ) :
2 if ( s . isdigit () ) :
3 return int ( s )
4 # Quito par é tesis externos
5 s = s [1: len ( s ) -1]
6 # Encontramos posici ó n operador
7 c = 0; pos = -1;
8 for i in range ( len ( s ) ) :
9 if ( s [ i ] == " ( " ) : c += 1
10 if ( s [ i ] == " ) " ) : c -= 1
11 if ( s [ i ] in [ ’+ ’ , ’ - ’ , ’* ’ , ’/ ’] and c ==0) :
12 pos = i ; break
13 # Retornamos el c á lculo
14 s1 = calcular ( s [: i ])
15 s2 = calcular ( s [ i +1:])
16 if ( s [ i ] == " + " ) : return s1 + s2
17 if ( s [ i ] == " -" ) : return s1 - s2
18 if ( s [ i ] == " * " ) : return s1 * s2
19 if ( s [ i ] == " / " ) : return s1 / s2
31
Clases pasadas Ejemplos Ejercicios Propuestos
Ejercicios Propuestos
32
Clases pasadas Ejemplos Ejercicios Propuestos
Ejercicios Propuestos
33