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
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
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
Recursión
            Notas de Programación


Recursión




                Lic. Ernesto Mislej   Curso de Nivelación de Algoritmos
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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

Curso de Nivelación de Algoritmos - Clase 4

  • 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