1. Recursión
Notas de Programación
Curso de Nivelación de Algoritmos
Clase 4
Lic. Ernesto Mislej
emislej@dc.uba.ar
Maestría y Carrera de Especialización en Explotación de Datos y Descubrimiento
de Conocimiento
23 de marzo de 2008
Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
2. Recursión
Notas de Programación
Recursión
Ejemplo
Se tiene un almacén lleno de autopartes. Se quiere saber el precio
de los productos, pero sólo se tiene una tabla de precios de partes y
cómo se fabrican los productos.
Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
3. Recursión
Notas de Programación
Recursión
Ejemplo
El producto #13 está compuesto por las partes #8, #3 y #2.
A su vez, la parte #8 está compuesta por otra parte #2 y la
parte #9.
La parte #9 está compuesta por 3 partes #3.
La parte #3 vale $1 y la parte #2 vale $4.
¿Cuánto vale el producto #13?
¿Es posible encontrar un algoritmo para encontrar el precio de
un producto?
Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
4. Recursión
Notas de Programación
Recursión
Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
5. Recursión
Notas de Programación
Recursión
Input: Un producto e
Output: El precio del producto e
Precio (e) ←
if e no está compuesto de otras partes then
return Costo(e);
else
a ← 0;
forall p ∈ Partes(e) do
a ← a + Precio(p);
end
return a;
end
Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
6. Recursión
Notas de Programación
Recursión
Ejemplo
Escribir en forma recursiva la función factorial.
Escribir la serie Fibonacci
F (0) = 0
F (1) = 1
F (n) = F (n − 1) + F (n − 2)
Implementen esta serie recursiva:
n − 10, if n > 100
M(n) =
M(M(n + 11)), if n ≤ 100
Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
7. Recursión
Notas de Programación
Recursión
>>> # Definición recursiva
>>> def fibo(n):
... if n < 2:
... return n
... else:
... return fibo(n-1) + fibo(n-2)
...
>>> fibo(0)
0
>>> fibo(1)
1
>>> fibo(8)
21
Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
8. Recursión
Notas de Programación
Recursión
Dividir el problema en sub-problemas del mismo tipo.
Las funciones recursivas cuentan de:
Caso Base: Uno o más casos ya definidos.
Llamada Recursiva: Reglas para descender al Caso Base.
Existen mecanismos para pasar de un esquema recursivo a un
esquema iterativo.
Los más complejos utilizan Pilas para almacenar las llamadas
recursivas.
Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
9. Recursión
Notas de Programación
Recursión
Ejemplo
Calcular el mínimo común múltiplo de 2 números.
Escribir en forma recursiva el algoritmo de MergeSort.
Cual es la menor cantidad de monedas, de valor
{1, 5, 10, 25, 50} para dar un vuelto de 99 centavos.
Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
10. Recursión
Notas de Programación
Más sobre listas
>>> # Más sobre listas
>>> a = [1,2,3,5,6,7,9]
>>> 4 in a
0
>>> 5 in a
1
>>> 4 not in a
1
>>> b = ["hola", "chau"]
>>> a + b
[1, 2, 3, 5, 6, 7, 9, ’hola’, ’chau’]
Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
11. Recursión
Notas de Programación
Más sobre listas
>>> # Más sobre listas
>>> a = [1,2,3,5,6,7,9]
>>> a * 2
[1, 2, 3, 5, 6, 7, 9, 1, 2, 3, 5, 6, 7, 9]
>>> 2 * a
[1, 2, 3, 5, 6, 7, 9, 1, 2, 3, 5, 6, 7, 9]
>>> len(a)
7
>>> min(a)
1
>>> max(a)
9
Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
12. Recursión
Notas de Programación
String Methods
count (sub[, start[, end]])
Devuelve el número de ocurrencias del substring sub en el string
S[start:end].
find (sub[, start[, end]])
Devuelve el índice correspondiente a la primera ocurrencia del
substring sub en el string S[start:end]. Devuelve -1 si sub no es
encontrada.
index (sub[, start[, end]])
Como find(), pero da un raise ValueError cuando el sub no es
encontrada.
join (seq)
Devuelve un string correspondiente a la concatenación de strings en
la lista seq. Usando como separador al propio string .
split ([sep [,maxsplit]])
Devuelve una lista de strings usando a sep como separador. maxsplit
se puede utilizar para fijar la cantidad máxima de separaciones.
Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
13. Recursión
Notas de Programación
String Methods
>>> a = "Los algoritmos me aburren"
>>> a.count("o")
3
>>> a.count("c")
0
>>> a.find("s")
2
>>> a.find("s", 3)
13
>>> a[13]
’s’
Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
14. Recursión
Notas de Programación
String Methods
>>> a = "Los algoritmos me aburricionan"
>>> a.find("d")
-1
>>> a.index("d")
Traceback (most recent call last):
File "<interactive input>", line 1, in ?
ValueError: substring not found in string.index
Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
15. Recursión
Notas de Programación
String Methods
>>> a = "Los algoritmos me aburricionan"
>>> a.split(" ")
[’Los’, ’algoritmos’, ’me’, ’aburricionan’]
>>> b = a.split(" ")
>>> ";".join(b)
’Los;algoritmos;me;aburricionan’
>>> " <> ".join(b)
’Los <> algoritmos <> me <> aburricionan’
Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
16. Recursión
Notas de Programación
File Object
file (filename[, mode[, bufsize]])
Devuelve un objeto file. El argumento filename es el
nombre del archivo a ser abierto/creado. Los modos
’r’, ’w’ y ’a’ abre el archivo para lectura,
escritura(trunca) y agregado, respectivamente.
open ()
Es un alias de la función file.
close ()
Cierra el archivo.
read ([size])
Lee (al menos tantos) size bytes del archivo.
readline ([size])
Lee una línea entera del archivo.
Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
17. Recursión
Notas de Programación
File Object
Supongamos que existe el archivo iris.data con esta pinta:
6.7,3.0,5.2,2.3,Iris-virginica.
6.0,2.2,5.0,1.5,Iris-virginica.
6.2,2.8,4.8,1.8,Iris-virginica.
7.7,3.8,6.7,2.2,Iris-virginica.
7.2,3.0,5.8,1.6,Iris-virginica.
5.5,2.4,3.8,1.1,Iris-versicolor.
6.0,2.7,5.1,1.6,Iris-versicolor.
5.5,2.5,4.0,1.3,Iris-versicolor.
...
Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
18. Recursión
Notas de Programación
File Object
>>> f = open ("H:facuiris.data", "r")
>>> l = f.readline()
>>> l
’6.7,3.0,5.2,2.3,Iris-virginica.n’
>>> l = f.readline()
>>> l
’6.0,2.2,5.0,1.5,Iris-virginica.n’
>>>
Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
19. Recursión
Notas de Programación
File Object
>>> f.seek(0) #rebobina el archivo
>>> l = f.readline()
>>> l
’6.7,3.0,5.2,2.3,Iris-virginica.n’
>>> while l: #Mientras existan líneas
... a = l.split(",")[0]
... print a
... l = f.readline()
...
6.7
6.0
6.2
7.7
7.2
5.5...
>>> l
’’
Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
20. Recursión
Notas de Programación
File Object
>>> #Si quiero sumar la primera columna
>>> f.seek(0) #rebobina el archivo
>>> a = 0
>>> l = f.readline()
>>> while l:
... a = a + float(l.split(",")[0])
... print a
... l = f.readline()
...
6.7
12.7
18.9
26.6
33.8...
>>> a
876.50000000000045
Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
21. Recursión
Notas de Programación
File Object
>>> #Si crear un file con las primeras 2 columnas
>>> #separados por ";"
>>> f.seek(0) #rebobina el archivo
>>> g = open("H:facuiris2.data", "w")
>>> l = f.readline()
>>> while l:
... a = l.split(",")[0:2]
... g.write (" ; ".join(a) + "n")
... l = f.readline()
...
>>> g.close()
>>> f.close()
Lic. Ernesto Mislej Curso de Nivelación de Algoritmos