21
Recursión Notas de Programación Curso de Nivelación de Algoritmos Clase 4 Lic. Ernesto Mislej [email protected] 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

Curso de Nivelación de Algoritmos - Clase 4

Embed Size (px)

Citation preview

Page 1: Curso de Nivelación de Algoritmos - Clase 4

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

Page 2: Curso de Nivelación de Algoritmos - Clase 4

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

Page 3: Curso de Nivelación de Algoritmos - Clase 4

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

Page 4: Curso de Nivelación de Algoritmos - Clase 4

RecursiónNotas de Programación

Recursión

Lic. Ernesto Mislej Curso de Nivelación de Algoritmos

Page 5: Curso de Nivelación de Algoritmos - Clase 4

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

Page 6: Curso de Nivelación de Algoritmos - Clase 4

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

Page 7: Curso de Nivelación de Algoritmos - Clase 4

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

Page 8: Curso de Nivelación de Algoritmos - Clase 4

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

Page 9: Curso de Nivelación de Algoritmos - Clase 4

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

Page 10: Curso de Nivelación de Algoritmos - Clase 4

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

Page 11: Curso de Nivelación de Algoritmos - Clase 4

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

Page 12: Curso de Nivelación de Algoritmos - Clase 4

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

Page 13: Curso de Nivelación de Algoritmos - Clase 4

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

Page 14: Curso de Nivelación de Algoritmos - Clase 4

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

Page 15: Curso de Nivelación de Algoritmos - Clase 4

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

Page 16: Curso de Nivelación de Algoritmos - Clase 4

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

Page 17: Curso de Nivelación de Algoritmos - Clase 4

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

Page 18: Curso de Nivelación de Algoritmos - Clase 4

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

Page 19: Curso de Nivelación de Algoritmos - Clase 4

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

Page 20: Curso de Nivelación de Algoritmos - Clase 4

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

Page 21: Curso de Nivelación de Algoritmos - Clase 4

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