Algoritmos y Programación




                            Clase 2:
                Repaso PyGame -
                   Recursión


                                       www.unaj.edu.ar
Algoritmos y Programación




                  Temario
                 • Repaso de PyGame
                     – Funciones básicas
                     – Animaciones y Juegos sencillos
                     – Manejo de eventos
                 • Recursión
                     –   Definicion de Recursion.
                     –   Pila de Ejecucion.
                     –   Backtracking
                     –   Recursion infinita.
                     –   Recursion vs Iteracion.


                                                        www.unaj.edu.ar
Algoritmos y Programación




                      Repaso: PyGame




                                       www.unaj.edu.ar
Algoritmos y Programación




                  ¿Qué es PyGame?
                • PyGame es un conjunto de módulos
                  escritos en Python diseñados para escribir
                  juegos en dos dimensiones.
                • Incluye gráficos y bibliotecas de sonido
                    diseñadas para ser utilizadas directamente bajo
                    Python.
                • No es nuevo: desde año 2000...
                • Es portable y libre.
                • Url: http://www.pygame.org/

                                                              www.unaj.edu.ar
Algoritmos y Programación




                  Modulos PyGame
         • Vamos a ver primero algunos módulos para
           realizar gráficos sencillos.
            – Cómo crear una ventana y dibujar luego en ella.
         • PyGame provee varios módulos para representar
           líneas, polígonos, círculos, etc.
         • Para utilizarlos, debemos importar la librería
           PyGame y otras más que serán necesarias:
                      import pygame
                       import pygame
                      import os
                       import os
                      Import sys
                       Import sys
                      from pygame.locals import **
                       from pygame.locals import
                                                      www.unaj.edu.ar
Algoritmos y Programación




                  Inicialización
         • Luego de importar las librerías, hay que inicializar
           el módulo:
                    pygame.init()
                    pygame.init()

         • ¿Abrimos una ventana?

              ventana = pygame.display.set_mode((ancho,alto))
               ventana = pygame.display.set_mode((ancho,alto))
              pygame.display.set_caption(‘TítuloVentana')
               pygame.display.set_caption(‘TítuloVentana')




                                                                 www.unaj.edu.ar
Algoritmos y Programación




                  Ventanas




                             www.unaj.edu.ar
Algoritmos y Programación




                  El módulo Draw
   • Permite trabajar con las siguientes formas:
             rect polygon circle
              rect polygon circle       ellipse arc
                                        ellipse arc
             line lines
              line lines        aaline
                                 aaline     aalines
                                             aalines
   • Los dibujos se realizan sobre una superficie y todas las
     funciones de dibujo se limitan al área de recorte para esa
     superficie.
   • Generalmente las funciones contienen un argumento width que
     representa el tamaño del borde del dibujo. Si tiene valor 0, la
     función pintará la figura entera como sólida.
   • La mayoría de las funciones aceptan un argumento color, que
     en general es una terna o tupla RGB.
                                                             www.unaj.edu.ar
Algoritmos y Programación




                  ¿Y estas funciones?
         • ¿Se acuerdan?
            – copy(): Realizamos una copia de la superficie. En
              este caso, de la ventana

            – blit(): Nos permite representar un objeto sobre
              una superficie.
         • ¿Para qué las usábamos?




                                                        www.unaj.edu.ar
Algoritmos y Programación

                Imagenes en PyGame
           Cargando imágenes ...
           • pygame.image.load(filename): return Surface
           • pygame.image.save(Surface, filename): return None




                                                            www.unaj.edu.ar
Algoritmos y Programación

                ¿Nos vamos al espacio?




                                         www.unaj.edu.ar
Algoritmos y Programación

                Eventos




                            El manejo de
                            eventos está
                            sólo aquí (QUI
                              www.unaj.edu.ar
Algoritmos y Programación




                  Manejo de Eventos
 import pygame, sys, os
 from pygame.locals import *
 .
 .
 .
 .


 while True:
   events=pygame.event.get()

    for event in events:          Este bucle sencillo ejecuta el
       if event.type == QUIT:     programa hasta que el evento
           pygame.quit()          QUIT se produzca.
           sys.exit()
                                                       www.unaj.edu.ar
Algoritmos y Programación




                  Manejo de Eventos
       Existe un módulo especial para manejar eventos.
       Los eventos se manejan a través de una cola de
       eventos.
       Se manejan como objetos que contienen un tipo de
       evento y un conjunto de datos de sólo lectura.
       Funciones get y poll: Obtienen eventos de la cola y
       los elimina.
             •   pygame.event.get(): return EventList
             •   pygame.event.poll(): return Event


                                                        www.unaj.edu.ar
Algoritmos y Programación




                  Manejo de Eventos
            Event.type:
      Eventos relacionados al mouse:
        MOUSEMOTION – MOUSEBUTTONUP – MOUSEBUTTONDOWN -
      Eventos relacionados al teclado:
        KEYDOWN – KEYUP
      Eventos relacionados al Joystick
        JOYAXISMOTION – JOYBALLMOTION – JOYHATMOTION -
        JOYBUTTONUP - JOYBUTTONDOWN
      Eventos generales
        QUIT – ACTIVEEVENT - VIDEORESIZE - VIDEOEXPOSE
      Se pueden generar eventos definidos por el usuario.


                                                   www.unaj.edu.ar
Algoritmos y Programación

                ¿Nos vamos al espacio?(parte II)
                             Establecemos la sup a mover

                                          En nuestro caso, el que
                                          delimita al cohete
                              Obtenemos los eventos de la cola de
                              eventos


                              event.type:KEYDOWN / KEYUP / etc
                              event.key: código tecla

                                     Muestro las imágenes y
                                     actualizo el rectángulo que
                                     contiene al cohete




                                                            www.unaj.edu.ar
Algoritmos y Programación

                Resumiendo   Evento            atributos
                             QUIT              none
Resumiendo...
                             ACTIVEEVENT       gain, state
  pygame.event.get() o       KEYDOWN           unicode, key, mod
pygame.event.poll()          KEYUP             key, mod
en un loop ....              MOUSEMOTION       pos, rel, buttons
  event.type                 MOUSEBUTTONUP     pos, button
  Dependiendo del            MOUSEBUTTONDOWN   pos, button
  evento:                    JOYAXISMOTION     joy, axis, value
                             JOYBALLMOTION     joy, ball, rel

                             JOYHATMOTION      joy, hat, value

                             JOYBUTTONUP       joy, button
                             JOYBUTTONDOWN     joy, button

                             VIDEORESIZE       size
                             VIDEOEXPOSE       none

                             USEREVENT         code
                                                         www.unaj.edu.ar
Algoritmos y Programación

                ¿Llegamos a la luna?
         Textos ...
          fuente=pygame.font.SysFont(None, 48)
          texto=fuente.render(' Llegaste! ', True, (255,255,255), (255,0,0)))




                                                                      www.unaj.edu.ar
Algoritmos y Programación




                            Recursion




                                        www.unaj.edu.ar
Algoritmos y Programación




                  Conceptos
         • La recursión es una técnica de programación muy
           poderosa, en la cual una función realiza llamadas
           a misma en pos de resolver un problema.

         • Razones para su uso:
              – Problemas “casi” irresolubles con las estructuras iterativas.
              – Soluciones elegantes.
              – Soluciones más simples.




                                                                        www.unaj.edu.ar
Algoritmos y Programación




                  Identificación de casos
         • En las funciones recursivas bien definidas se
           puede identificar dos elementos:
            – Caso Base: Se da cuando el calculo es tan
              simple que se puede resolver directamente sin
              necesidad de hacer una llamada recursiva.
            – Caso Recursivo: aquí la función realiza
              algunas operaciones con las que se reduce la
              complejidad del problema y luego realiza un
              llamado a si misma.


                                                      www.unaj.edu.ar
Algoritmos y Programación




                  Comenzando...

         • Codificar una función que tome un parámetro
           numérico y que cuente hacia atrás comenzando
           desde el numero ingresado.




                                                   www.unaj.edu.ar
Algoritmos y Programación




                  Resolución en Python


                                        Caso Base: Cuando el
                                        parametro es 0, la función
                                        imprime “Fin!” y termina.




                              Caso Recursivo: Cuando el parametro
                              distinto de 0, la función imprime el
                              parametro y vuelve a invocar a la función
                              con el parametro disminuido en 1.

                                                              www.unaj.edu.ar
Algoritmos y Programación




                  Ejecución




                            Resultado de ejecutar la función recursiva
                            enviandole como parametro el numero 3.



                                                                         www.unaj.edu.ar
Algoritmos y Programación




      Pila de Ejecución


                            Imprime 3 en la consola y
                            realiza un llamado
                            recursivo con n-1=3-1=2




                            cuenta_atras

                            n=3


                                                        www.unaj.edu.ar
Algoritmos y Programación




      Pila de Ejecución
                            Imprime 2 en la consola
                            y realiza un llamado
                            recursivo con n-1=2-1=1


                               cuenta_atras

                               n=2



                               cuenta_atras

                               n=3



                                                      www.unaj.edu.ar
Algoritmos y Programación




      Pila de Ejecución
                      cuenta_atras

           Imprime 1 en la consola   n=1
           y realiza un llamado
           recursivo con n-1=1-1=0

                                     cuenta_atras

                                     n=2



                                     cuenta_atras

                                     n=3



                                                    www.unaj.edu.ar
Algoritmos y Programación                                cuenta_atras

                                                         n=0


      Pila de Ejecución
                                                         cuenta_atras

                  Imprime “Fin!” y termina la funcion.   n=1



                                                         cuenta_atras

                                                         n=2



                                                         cuenta_atras

                                                         n=3


                                                                        www.unaj.edu.ar
Algoritmos y Programación                      cuenta_atras

                                               n=0


      Pila de Ejecución
                                               cuenta_atras
         Cuando concluye el llamado
                •
         recursivo la ejecucion se retoma en
         este punto                            n=1
                •

                                               cuenta_atras

                                               n=2



                                               cuenta_atras

                                               n=3


                                                              www.unaj.edu.ar
Algoritmos y Programación




      Pila de Ejecución
                •
                •




                            Finaliza la ejecución del programa.




                                                            www.unaj.edu.ar
Algoritmos y Programación




                  Backtracking
         • El backtracking (ó vuelta atrás) es una estrategia
           para solucionar problemas utilizando algoritmos
           recursivos.

         • El backtracking va construyendo soluciones
           parciales a medida que progresa la ejecución del
           algoritmo recursivo. Estas soluciones parciales van
           construyendo una solución completa.



                                                        www.unaj.edu.ar
Algoritmos y Programación




                  Backtracking
         • El algoritmo tiene éxito si, procediendo de esta
           forma, se puede encontrar una solución.
              – En este caso el algoritmo puede bien detenerse (si solo
                se necesita una solución) o bien seguir buscando
                soluciones alternativas (si se necesitan todas).
         • Por otra parte, el algoritmo falla si en alguna etapa
           la solución parcial construida hasta el momento no
           se puede completar.
              – En tal caso, el recorrido vuelve atrás eliminando sobre la
                marcha los elementos que se hubieran añadido en cada
                etapa.

                                                                  www.unaj.edu.ar
Algoritmos y Programación




                  Ejemplo con backtracking

         • Codificar una función que tome una lista de
           números y retorne una tupla en la cual contenga
           en la primera posición el promedio y en la segunda
           los números de la lista mayores al promedio.




                                                      www.unaj.edu.ar
Algoritmos y Programación
                            mayores_al_promedio   mayores_al_promedio
Ejemplo con backtracking
               lista=[]                           lista=[4]
                            suma_total=10         suma_total=6
                            cantidad=4            cantidad=3


                                                  mayores_al_promedio
                                                  lista=[3,4]
                                                  suma_total=3
                                                  cantidad=2


                                                  mayores_al_promedio
                                                  lista=[2,3,4]
                                                  suma_total=1
                                                  cantidad=1


                                                  mayores_al_promedio
                                                  lista=[1,2,3,4]
                                                  suma_total=0
                                                  cantidad=0
                                                                    www.unaj.edu.ar
Algoritmos y Programación
                                mayores_al_promedio   mayores_al_promedio
Ejemplo con backtracking
               lista=[]                               lista=[4]
         Retorna una tupla con el suma_total=10
                                  promedio            suma_total=6
         y una lista vacia.       cantidad=4          cantidad=3


                                                      mayores_al_promedio
                                                      lista=[3,4]
                                                      suma_total=3
                                                      cantidad=2


                                                      mayores_al_promedio
                                                      lista=[2,3,4]
                                                      suma_total=1
                                                      cantidad=1


                                                      mayores_al_promedio
                                                      lista=[1,2,3,4]
                                                      suma_total=0
                                                      cantidad=0
                                                                        www.unaj.edu.ar
Algoritmos y Programación
                                       mayores_al_promedio
Ejemplo con backtracking               lista=[4]
                                       suma_total=6
                                       cantidad=3

Cuando concluye el llamado             mayores_al_promedio
recursivo la ejecucion se retoma en
                                       lista=[3,4]
este punto
                                       suma_total=3
                                       cantidad=2


                                       mayores_al_promedio
                                       lista=[2,3,4]
   Retorna una tupla con el promedio   suma_total=1
   y la lista [4].                     cantidad=1


                                       mayores_al_promedio
                                       lista=[1,2,3,4]
                                       suma_total=0
                                       cantidad=0
                                                         www.unaj.edu.ar
Algoritmos y Programación


Ejemplo con backtracking

Cuando concluye el llamado             mayores_al_promedio
recursivo la ejecucion se retoma en
                                       lista=[3,4]
este punto
                                       suma_total=3
                                       cantidad=2


                                       mayores_al_promedio
                                       lista=[2,3,4]
   Retorna una tupla con el promedio   suma_total=1
   y la lista [4].
              [4,3].                   cantidad=1


                                       mayores_al_promedio
                                       lista=[1,2,3,4]
                                       suma_total=0
                                       cantidad=0
                                                         www.unaj.edu.ar
Algoritmos y Programación


Ejemplo con backtracking

Cuando concluye el llamado
recursivo la ejecucion se retoma en
este punto



                                       mayores_al_promedio
                                       lista=[2,3,4]
   Retorna una tupla con el promedio   suma_total=1
   y la lista [4].
              [4,3].                   cantidad=1


                                       mayores_al_promedio
                                       lista=[1,2,3,4]
                                       suma_total=0
                                       cantidad=0
                                                         www.unaj.edu.ar
Algoritmos y Programación


Ejemplo con backtracking

Cuando concluye el llamado
recursivo la ejecucion se retoma en
este punto




   Retorna una tupla con el promedio
   y la lista [4].
              [4,3].


                                       mayores_al_promedio
                                       lista=[1,2,3,4]
                                       suma_total=0
                                       cantidad=0
                                                         www.unaj.edu.ar
Algoritmos y Programación


Ejemplo con backtracking




                            Finaliza el programa e imprime
                            como resultado (2, [4,3])

                                                    www.unaj.edu.ar
Algoritmos y Programación




                  Recursividad infinita
         • Si una función recursiva no alcanza nunca el caso
           base, seguirá haciendo llamadas recursivas para
           siempre y nunca terminaría. Esta circunstancia se
           conoce como recursion infinita.

         • Un programa con recursividad infinita no se
           ejecuta realmente para siempre. Python informara
           con un mensaje de error cuando se alcance el
           nivel máximo de recursividad.


                                                      www.unaj.edu.ar
Algoritmos y Programación



                  Ejemplos
                               Ejemplo de una función que al no
                               definir un caso base y ser
              def recurre():   invocada, esta no finaliza nunca.
               recurre()




                                   En este caso se llama a la función
                                   con un dato en el parametro que
                                   hace que nunca se alcance el caso
                                   base.
                                                                   www.unaj.edu.ar
Algoritmos y Programación




                  Calculando el factorial
         • Se necesita un función en Python para calcular el
           numero factorial de un numero pasado por
           parámetro.
         • La definición matemática del factorial es la
           siguiente:




                                                       www.unaj.edu.ar
Algoritmos y Programación




                  Alternativas
         • Existen dos alternativas para resolver el problema
           del calculo del factorial:
            – Codificar una función iterativa.
            – Codificar una función recursiva.




                                                       www.unaj.edu.ar
Algoritmos y Programación




                  Versiones del Factorial


                 Versión Iterativa   Versión Recursiva




                                                         www.unaj.edu.ar
Algoritmos y Programación




                  Comparación
         • Ahora si comparamos las dos alternativas:
            – ambas están basadas en una estructura de
              control.
            – ambas involucran repetición.
            – ambas incluyen una condición para terminar.
            – Si no se tiene cuidado en ambas se puede
              incurrir en un loop infinito.




                                                      www.unaj.edu.ar
Algoritmos y Programación




                  ¿Recursión o Iteración?
         • Ventajas de la Recursión ya conocidas:
            – Soluciones simples, claras.
            – Soluciones elegantes.
            – Soluciones a problemas complejos.




                                                    www.unaj.edu.ar
Algoritmos y Programación




                  ¿Recursión o Iteración?
   • Desventajas de la Recursión: INEFICIENCIA
      – Sobrecarga asociada con las llamadas recursivas,
        una llamada puede generar un gran numero de
        llamadas recursivas.(factorial_recursivo(n) genera n
        llamadas recursivas)
   • ¿La claridad compensa la sobrecarga?
   • El valor de la recursividad reside en el hecho de que
     se puede usar para resolver problemas sin fácil
     solución iterativa.


                                                     www.unaj.edu.ar

Clase2

  • 1.
    Algoritmos y Programación Clase 2: Repaso PyGame - Recursión www.unaj.edu.ar
  • 2.
    Algoritmos y Programación Temario • Repaso de PyGame – Funciones básicas – Animaciones y Juegos sencillos – Manejo de eventos • Recursión – Definicion de Recursion. – Pila de Ejecucion. – Backtracking – Recursion infinita. – Recursion vs Iteracion. www.unaj.edu.ar
  • 3.
    Algoritmos y Programación Repaso: PyGame www.unaj.edu.ar
  • 4.
    Algoritmos y Programación ¿Qué es PyGame? • PyGame es un conjunto de módulos escritos en Python diseñados para escribir juegos en dos dimensiones. • Incluye gráficos y bibliotecas de sonido diseñadas para ser utilizadas directamente bajo Python. • No es nuevo: desde año 2000... • Es portable y libre. • Url: http://www.pygame.org/ www.unaj.edu.ar
  • 5.
    Algoritmos y Programación Modulos PyGame • Vamos a ver primero algunos módulos para realizar gráficos sencillos. – Cómo crear una ventana y dibujar luego en ella. • PyGame provee varios módulos para representar líneas, polígonos, círculos, etc. • Para utilizarlos, debemos importar la librería PyGame y otras más que serán necesarias: import pygame import pygame import os import os Import sys Import sys from pygame.locals import ** from pygame.locals import www.unaj.edu.ar
  • 6.
    Algoritmos y Programación Inicialización • Luego de importar las librerías, hay que inicializar el módulo: pygame.init() pygame.init() • ¿Abrimos una ventana? ventana = pygame.display.set_mode((ancho,alto)) ventana = pygame.display.set_mode((ancho,alto)) pygame.display.set_caption(‘TítuloVentana') pygame.display.set_caption(‘TítuloVentana') www.unaj.edu.ar
  • 7.
    Algoritmos y Programación Ventanas www.unaj.edu.ar
  • 8.
    Algoritmos y Programación El módulo Draw • Permite trabajar con las siguientes formas: rect polygon circle rect polygon circle ellipse arc ellipse arc line lines line lines aaline aaline aalines aalines • Los dibujos se realizan sobre una superficie y todas las funciones de dibujo se limitan al área de recorte para esa superficie. • Generalmente las funciones contienen un argumento width que representa el tamaño del borde del dibujo. Si tiene valor 0, la función pintará la figura entera como sólida. • La mayoría de las funciones aceptan un argumento color, que en general es una terna o tupla RGB. www.unaj.edu.ar
  • 9.
    Algoritmos y Programación ¿Y estas funciones? • ¿Se acuerdan? – copy(): Realizamos una copia de la superficie. En este caso, de la ventana – blit(): Nos permite representar un objeto sobre una superficie. • ¿Para qué las usábamos? www.unaj.edu.ar
  • 10.
    Algoritmos y Programación Imagenes en PyGame Cargando imágenes ... • pygame.image.load(filename): return Surface • pygame.image.save(Surface, filename): return None www.unaj.edu.ar
  • 11.
    Algoritmos y Programación ¿Nos vamos al espacio? www.unaj.edu.ar
  • 12.
    Algoritmos y Programación Eventos El manejo de eventos está sólo aquí (QUI www.unaj.edu.ar
  • 13.
    Algoritmos y Programación Manejo de Eventos import pygame, sys, os from pygame.locals import * . . . . while True: events=pygame.event.get() for event in events: Este bucle sencillo ejecuta el if event.type == QUIT: programa hasta que el evento pygame.quit() QUIT se produzca. sys.exit() www.unaj.edu.ar
  • 14.
    Algoritmos y Programación Manejo de Eventos Existe un módulo especial para manejar eventos. Los eventos se manejan a través de una cola de eventos. Se manejan como objetos que contienen un tipo de evento y un conjunto de datos de sólo lectura. Funciones get y poll: Obtienen eventos de la cola y los elimina. • pygame.event.get(): return EventList • pygame.event.poll(): return Event www.unaj.edu.ar
  • 15.
    Algoritmos y Programación Manejo de Eventos Event.type: Eventos relacionados al mouse: MOUSEMOTION – MOUSEBUTTONUP – MOUSEBUTTONDOWN - Eventos relacionados al teclado: KEYDOWN – KEYUP Eventos relacionados al Joystick JOYAXISMOTION – JOYBALLMOTION – JOYHATMOTION - JOYBUTTONUP - JOYBUTTONDOWN Eventos generales QUIT – ACTIVEEVENT - VIDEORESIZE - VIDEOEXPOSE Se pueden generar eventos definidos por el usuario. www.unaj.edu.ar
  • 16.
    Algoritmos y Programación ¿Nos vamos al espacio?(parte II) Establecemos la sup a mover En nuestro caso, el que delimita al cohete Obtenemos los eventos de la cola de eventos event.type:KEYDOWN / KEYUP / etc event.key: código tecla Muestro las imágenes y actualizo el rectángulo que contiene al cohete www.unaj.edu.ar
  • 17.
    Algoritmos y Programación Resumiendo Evento atributos QUIT none Resumiendo... ACTIVEEVENT gain, state pygame.event.get() o KEYDOWN unicode, key, mod pygame.event.poll() KEYUP key, mod en un loop .... MOUSEMOTION pos, rel, buttons event.type MOUSEBUTTONUP pos, button Dependiendo del MOUSEBUTTONDOWN pos, button evento: JOYAXISMOTION joy, axis, value JOYBALLMOTION joy, ball, rel JOYHATMOTION joy, hat, value JOYBUTTONUP joy, button JOYBUTTONDOWN joy, button VIDEORESIZE size VIDEOEXPOSE none USEREVENT code www.unaj.edu.ar
  • 18.
    Algoritmos y Programación ¿Llegamos a la luna? Textos ... fuente=pygame.font.SysFont(None, 48) texto=fuente.render(' Llegaste! ', True, (255,255,255), (255,0,0))) www.unaj.edu.ar
  • 19.
    Algoritmos y Programación Recursion www.unaj.edu.ar
  • 20.
    Algoritmos y Programación Conceptos • La recursión es una técnica de programación muy poderosa, en la cual una función realiza llamadas a misma en pos de resolver un problema. • Razones para su uso: – Problemas “casi” irresolubles con las estructuras iterativas. – Soluciones elegantes. – Soluciones más simples. www.unaj.edu.ar
  • 21.
    Algoritmos y Programación Identificación de casos • En las funciones recursivas bien definidas se puede identificar dos elementos: – Caso Base: Se da cuando el calculo es tan simple que se puede resolver directamente sin necesidad de hacer una llamada recursiva. – Caso Recursivo: aquí la función realiza algunas operaciones con las que se reduce la complejidad del problema y luego realiza un llamado a si misma. www.unaj.edu.ar
  • 22.
    Algoritmos y Programación Comenzando... • Codificar una función que tome un parámetro numérico y que cuente hacia atrás comenzando desde el numero ingresado. www.unaj.edu.ar
  • 23.
    Algoritmos y Programación Resolución en Python Caso Base: Cuando el parametro es 0, la función imprime “Fin!” y termina. Caso Recursivo: Cuando el parametro distinto de 0, la función imprime el parametro y vuelve a invocar a la función con el parametro disminuido en 1. www.unaj.edu.ar
  • 24.
    Algoritmos y Programación Ejecución Resultado de ejecutar la función recursiva enviandole como parametro el numero 3. www.unaj.edu.ar
  • 25.
    Algoritmos y Programación Pila de Ejecución Imprime 3 en la consola y realiza un llamado recursivo con n-1=3-1=2 cuenta_atras n=3 www.unaj.edu.ar
  • 26.
    Algoritmos y Programación Pila de Ejecución Imprime 2 en la consola y realiza un llamado recursivo con n-1=2-1=1 cuenta_atras n=2 cuenta_atras n=3 www.unaj.edu.ar
  • 27.
    Algoritmos y Programación Pila de Ejecución cuenta_atras Imprime 1 en la consola n=1 y realiza un llamado recursivo con n-1=1-1=0 cuenta_atras n=2 cuenta_atras n=3 www.unaj.edu.ar
  • 28.
    Algoritmos y Programación cuenta_atras n=0 Pila de Ejecución cuenta_atras Imprime “Fin!” y termina la funcion. n=1 cuenta_atras n=2 cuenta_atras n=3 www.unaj.edu.ar
  • 29.
    Algoritmos y Programación cuenta_atras n=0 Pila de Ejecución cuenta_atras Cuando concluye el llamado • recursivo la ejecucion se retoma en este punto n=1 • cuenta_atras n=2 cuenta_atras n=3 www.unaj.edu.ar
  • 30.
    Algoritmos y Programación Pila de Ejecución • • Finaliza la ejecución del programa. www.unaj.edu.ar
  • 31.
    Algoritmos y Programación Backtracking • El backtracking (ó vuelta atrás) es una estrategia para solucionar problemas utilizando algoritmos recursivos. • El backtracking va construyendo soluciones parciales a medida que progresa la ejecución del algoritmo recursivo. Estas soluciones parciales van construyendo una solución completa. www.unaj.edu.ar
  • 32.
    Algoritmos y Programación Backtracking • El algoritmo tiene éxito si, procediendo de esta forma, se puede encontrar una solución. – En este caso el algoritmo puede bien detenerse (si solo se necesita una solución) o bien seguir buscando soluciones alternativas (si se necesitan todas). • Por otra parte, el algoritmo falla si en alguna etapa la solución parcial construida hasta el momento no se puede completar. – En tal caso, el recorrido vuelve atrás eliminando sobre la marcha los elementos que se hubieran añadido en cada etapa. www.unaj.edu.ar
  • 33.
    Algoritmos y Programación Ejemplo con backtracking • Codificar una función que tome una lista de números y retorne una tupla en la cual contenga en la primera posición el promedio y en la segunda los números de la lista mayores al promedio. www.unaj.edu.ar
  • 34.
    Algoritmos y Programación mayores_al_promedio mayores_al_promedio Ejemplo con backtracking lista=[] lista=[4] suma_total=10 suma_total=6 cantidad=4 cantidad=3 mayores_al_promedio lista=[3,4] suma_total=3 cantidad=2 mayores_al_promedio lista=[2,3,4] suma_total=1 cantidad=1 mayores_al_promedio lista=[1,2,3,4] suma_total=0 cantidad=0 www.unaj.edu.ar
  • 35.
    Algoritmos y Programación mayores_al_promedio mayores_al_promedio Ejemplo con backtracking lista=[] lista=[4] Retorna una tupla con el suma_total=10 promedio suma_total=6 y una lista vacia. cantidad=4 cantidad=3 mayores_al_promedio lista=[3,4] suma_total=3 cantidad=2 mayores_al_promedio lista=[2,3,4] suma_total=1 cantidad=1 mayores_al_promedio lista=[1,2,3,4] suma_total=0 cantidad=0 www.unaj.edu.ar
  • 36.
    Algoritmos y Programación mayores_al_promedio Ejemplo con backtracking lista=[4] suma_total=6 cantidad=3 Cuando concluye el llamado mayores_al_promedio recursivo la ejecucion se retoma en lista=[3,4] este punto suma_total=3 cantidad=2 mayores_al_promedio lista=[2,3,4] Retorna una tupla con el promedio suma_total=1 y la lista [4]. cantidad=1 mayores_al_promedio lista=[1,2,3,4] suma_total=0 cantidad=0 www.unaj.edu.ar
  • 37.
    Algoritmos y Programación Ejemplocon backtracking Cuando concluye el llamado mayores_al_promedio recursivo la ejecucion se retoma en lista=[3,4] este punto suma_total=3 cantidad=2 mayores_al_promedio lista=[2,3,4] Retorna una tupla con el promedio suma_total=1 y la lista [4]. [4,3]. cantidad=1 mayores_al_promedio lista=[1,2,3,4] suma_total=0 cantidad=0 www.unaj.edu.ar
  • 38.
    Algoritmos y Programación Ejemplocon backtracking Cuando concluye el llamado recursivo la ejecucion se retoma en este punto mayores_al_promedio lista=[2,3,4] Retorna una tupla con el promedio suma_total=1 y la lista [4]. [4,3]. cantidad=1 mayores_al_promedio lista=[1,2,3,4] suma_total=0 cantidad=0 www.unaj.edu.ar
  • 39.
    Algoritmos y Programación Ejemplocon backtracking Cuando concluye el llamado recursivo la ejecucion se retoma en este punto Retorna una tupla con el promedio y la lista [4]. [4,3]. mayores_al_promedio lista=[1,2,3,4] suma_total=0 cantidad=0 www.unaj.edu.ar
  • 40.
    Algoritmos y Programación Ejemplocon backtracking Finaliza el programa e imprime como resultado (2, [4,3]) www.unaj.edu.ar
  • 41.
    Algoritmos y Programación Recursividad infinita • Si una función recursiva no alcanza nunca el caso base, seguirá haciendo llamadas recursivas para siempre y nunca terminaría. Esta circunstancia se conoce como recursion infinita. • Un programa con recursividad infinita no se ejecuta realmente para siempre. Python informara con un mensaje de error cuando se alcance el nivel máximo de recursividad. www.unaj.edu.ar
  • 42.
    Algoritmos y Programación Ejemplos Ejemplo de una función que al no definir un caso base y ser def recurre(): invocada, esta no finaliza nunca. recurre() En este caso se llama a la función con un dato en el parametro que hace que nunca se alcance el caso base. www.unaj.edu.ar
  • 43.
    Algoritmos y Programación Calculando el factorial • Se necesita un función en Python para calcular el numero factorial de un numero pasado por parámetro. • La definición matemática del factorial es la siguiente: www.unaj.edu.ar
  • 44.
    Algoritmos y Programación Alternativas • Existen dos alternativas para resolver el problema del calculo del factorial: – Codificar una función iterativa. – Codificar una función recursiva. www.unaj.edu.ar
  • 45.
    Algoritmos y Programación Versiones del Factorial Versión Iterativa Versión Recursiva www.unaj.edu.ar
  • 46.
    Algoritmos y Programación Comparación • Ahora si comparamos las dos alternativas: – ambas están basadas en una estructura de control. – ambas involucran repetición. – ambas incluyen una condición para terminar. – Si no se tiene cuidado en ambas se puede incurrir en un loop infinito. www.unaj.edu.ar
  • 47.
    Algoritmos y Programación ¿Recursión o Iteración? • Ventajas de la Recursión ya conocidas: – Soluciones simples, claras. – Soluciones elegantes. – Soluciones a problemas complejos. www.unaj.edu.ar
  • 48.
    Algoritmos y Programación ¿Recursión o Iteración? • Desventajas de la Recursión: INEFICIENCIA – Sobrecarga asociada con las llamadas recursivas, una llamada puede generar un gran numero de llamadas recursivas.(factorial_recursivo(n) genera n llamadas recursivas) • ¿La claridad compensa la sobrecarga? • El valor de la recursividad reside en el hecho de que se puede usar para resolver problemas sin fácil solución iterativa. www.unaj.edu.ar