Upload
ernesto-mislej
View
781
Download
0
Embed Size (px)
Citation preview
RecursiónNotas de Programación
Curso de Nivelación de AlgoritmosClase 4
Lic. Ernesto [email protected]
Maestría y Carrera de Especialización en Explotación de Datos y Descubrimientode Conocimiento
23 de marzo de 2008
Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
RecursiónNotas de Programación
Recursión
EjemploSe tiene un almacén lleno de autopartes. Se quiere saber el preciode los productos, pero sólo se tiene una tabla de precios de partes ycómo se fabrican los productos.
Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
RecursiónNotas de Programación
Recursión
Ejemplo
I El producto #13 está compuesto por las partes #8, #3 y #2.I A su vez, la parte #8 está compuesta por otra parte #2 y la
parte #9.I La parte #9 está compuesta por 3 partes #3.I La parte #3 vale $1 y la parte #2 vale $4.
I ¿Cuánto vale el producto #13?I ¿Es posible encontrar un algoritmo para encontrar el precio de
un producto?
Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
RecursiónNotas de Programación
Recursión
Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
RecursiónNotas de Programación
Recursión
Input: Un producto eOutput: 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);endreturn a;
end
Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
RecursiónNotas de Programación
Recursión
Ejemplo
I Escribir en forma recursiva la función factorial.I Escribir la serie Fibonacci
F (0) = 0F (1) = 1F (n) = F (n − 1) + F (n − 2)
I Implementen esta serie recursiva:
M(n) =
{n − 10, if n > 100
M(M(n + 11)), if n ≤ 100
Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
RecursiónNotas 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
RecursiónNotas de Programación
Recursión
I Dividir el problema en sub-problemas del mismo tipo.I Las funciones recursivas cuentan de:
I Caso Base: Uno o más casos ya definidos.I Llamada Recursiva: Reglas para descender al Caso Base.
I Existen mecanismos para pasar de un esquema recursivo a unesquema iterativo.
I Los más complejos utilizan Pilas para almacenar las llamadasrecursivas.
Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
RecursiónNotas de Programación
Recursión
Ejemplo
I Calcular el mínimo común múltiplo de 2 números.I Escribir en forma recursiva el algoritmo de MergeSort.I 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
RecursiónNotas de Programación
Más sobre listas
>>> # Más sobre listas>>> a = [1,2,3,5,6,7,9]>>> 4 in a0>>> 5 in a1>>> 4 not in a1
>>> b = ["hola", "chau"]>>> a + b[1, 2, 3, 5, 6, 7, 9, ’hola’, ’chau’]
Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
RecursiónNotas 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
RecursiónNotas de Programación
String Methods
count (sub[, start[, end]])Devuelve el número de ocurrencias del substring sub en el stringS[start:end].
find (sub[, start[, end]])Devuelve el índice correspondiente a la primera ocurrencia delsubstring sub en el string S[start:end]. Devuelve -1 si sub no esencontrada.
index (sub[, start[, end]])Como find(), pero da un raise ValueError cuando el sub no esencontrada.
join (seq)Devuelve un string correspondiente a la concatenación de strings enla lista seq. Usando como separador al propio string .
split ([sep [,maxsplit]])Devuelve una lista de strings usando a sep como separador. maxsplitse puede utilizar para fijar la cantidad máxima de separaciones.
Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
RecursiónNotas 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
RecursiónNotas 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
RecursiónNotas 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
RecursiónNotas de Programación
File Object
file (filename[, mode[, bufsize]])Devuelve un objeto file. El argumento filename es elnombre 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
RecursiónNotas 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
RecursiónNotas de Programación
File Object
>>> f = open ("H:\\facu\\iris.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
RecursiónNotas 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.76.06.27.77.25.5...
>>> l’’
Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
RecursiónNotas 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.712.718.926.633.8...
>>> a876.50000000000045
Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
RecursiónNotas 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:\\facu\\iris2.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