cc 1002: introduccióna la programación recursión
TRANSCRIPT
![Page 1: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/1.jpg)
CC 1002: Introducción a la ProgramaciónRecursión
Nelson Baloian, José A. Pino
![Page 2: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/2.jpg)
Recursión
• Dícese de un proceso o función que se define a partir de si misma.
• La idea es dividir el problema en instancias mas simples y pequeñas del mismo problema.
• Similar a la inducción.
![Page 3: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/3.jpg)
Factorial
• El factorial de un número n se define como:• ! · 1 · 2 ·. . .· 2 · 1
• Se puede definir recursivamente de la siguiente manera
! 1 0· 1 ! 0
![Page 4: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/4.jpg)
Factorial en Python
![Page 5: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/5.jpg)
Operación de Factorial recursivo
f(4)=4*f(3)f(3)=3*f(2)
f(2)=2*f(1)f(1)=1*f(0)
← f(0)=1← f(1)=1 * 1=1
← f(2)=2 * 1=2← f(3)=3 * 2=6
f(4)=4* 6=24
![Page 6: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/6.jpg)
Potencia (recursivamente)
• Definición recursiva de potencia
• Calculo :
1 0· 0
2 2 · 22 · 22 · 2 · 22 · 2 · 2 · 22 · 2 · 2 · 2 · 2
2 · 2 · 2 · 2 · 116
![Page 7: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/7.jpg)
Potencia (recursivamente)
1 0· 0
Caso Base
Caso Recursivo
![Page 8: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/8.jpg)
En Python
![Page 9: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/9.jpg)
Solución más eficiente
1 0 ·
/ · /
Podemos realizar mas de una llamada recursiva
Podemos tener masde un caso recursivo
![Page 10: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/10.jpg)
En Python
Notar que se realizan varios llamados recursivos que producen el mismo resultado!
![Page 11: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/11.jpg)
¿Se puede hacer mejor?Si
Calculamos el valor recursivamente 1 vez
Luego reutilizamos este resultado en donde sea necesario.
![Page 12: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/12.jpg)
Los Números de Fibonacci
0 01 1
2Podemos tener masde un caso base
Secuencia de números de la forma:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55…
Cada elemento es la suma de los 2 anteriores!
![Page 13: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/13.jpg)
Fibonacci (paréntesis)
Patrón de crecimiento de las ramas de una planta
![Page 14: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/14.jpg)
En Python
![Page 15: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/15.jpg)
Funciones que no retornan valores
Si llega a este punto, la función retorna, y no ejecuta las instrucciones que siguen mas abajo.
El llamado recursivo a si misma, permite simular un ciclo de ejecución hasta que el usuario adivine (o se rinda)
![Page 16: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/16.jpg)
Modulo Turtle (Tortuga)
• Modulo de Python que provee funciones para dibujar en pantalla.
• Algunas funciones provistas son:• turtle.forward(size): La tortuga se mueve una
distancia size en su dirección actual.• turtle.left(angle): La tortuga gira angle grados a la
izquierda.• turtle.right(angle): La tortuga gira angle grados a la
derecha.
![Page 17: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/17.jpg)
Modulo Turtle (Tortuga)
• Modulo de Python que provee funciones para dibujar en pantalla.
• Algunas funciones provistas son:• turtle.done(): Indica que terminamos de dibujar.• turtle.resetscreen(): Borra todo dibujo realizado por
la tortuga.• turtle.penup(): Levanta el lápiz de dibujo. Permite
mover la tortuga sin dibujar.• turtle.pendown(): Baja el lápiz de dibujo. Permite
mover la tortuga dibujando su camino.
![Page 18: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/18.jpg)
Modulo Turtle (Ejemplos)>>> import turtle>>> turtle.forward(100)
![Page 19: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/19.jpg)
Modulo Turtle (Ejemplos)>>> import turtle>>> turtle.forward(100)>>> turtle.left(90)
![Page 20: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/20.jpg)
Modulo Turtle (Ejemplos)>>> import turtle>>> turtle.forward(100)>>> turtle.left(90)>>> turtle.forward(100)
![Page 21: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/21.jpg)
Modulo Turtle (Ejemplos)>>> import turtle>>> turtle.forward(100)>>> turtle.left(90)>>> turtle.forward(100)>>> turtle.left(90)>>> turtle.penup()>>> turtle.forward(100)
![Page 22: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/22.jpg)
Modulo Turtle (Ejemplos)>>> import turtle>>> turtle.forward(100)>>> turtle.left(90)>>> turtle.forward(100)>>> turtle.left(90)>>> turtle.penup()>>> turtle.forward(100)>>> turtle.left(90)>>> turtle.pendown()>>> turtle.forward(50)
![Page 23: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/23.jpg)
Modulo Turtle (Funciones)
>>> Cuadrado(100)
![Page 24: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/24.jpg)
Fractales
• Objeto geométrico cuya estructura se repite a diferentes escalas.
• Es decir, su forma esta hecha de copias mas pequeñas de su misma figura.
![Page 25: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/25.jpg)
Fractales
![Page 26: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/26.jpg)
Fractales
![Page 27: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/27.jpg)
Fractales
![Page 28: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/28.jpg)
Copo de nieve de Koch
• Fractal cuya forma es similar a un copo de nieve.
![Page 29: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/29.jpg)
Copo de nieve de Koch
Base Nivel 1 Nivel 2 Nivel 3
Generador
![Page 30: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/30.jpg)
Copo de nieve de Koch
• Construcción del copo de nieve:
• Repetir la figura inicial (generador) sobre si mismo tantos niveles como se desee recursivamente.
• Repetir esta construcción 3 veces sobre la figura base (un triangulo)
1
2
3
4
0
![Page 31: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/31.jpg)
Copo de nieve (Algoritmo)
• Para dibujar un segmento:• Dibujar recursivamente el fractal en el segmento 1• Girar 60 grados a la izquierda• Dibujar recursivamente el fractal en el segmento 2• Girar 120 grados a la derecha• Dibujar recursivamente el fractal en el segmento 3• Girar 60 grados a la izquierda• Dibujar recursivamente el fractal en el segmento 4
1
2 3
4
![Page 32: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/32.jpg)
Copo de nieve (Código)
![Page 33: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/33.jpg)
Copo de nieve (Código)
>>> snowflake(320,3)
![Page 34: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/34.jpg)
Las torres de Hanoi• Puzzle matemático que consiste en mover todos los discos de una
vara a otra, bajo ciertas restricciones. El juego consta de una plataforma con tres varas y n discos puestos en orden decreciente de tamaño en una de ellas. El objetivo del juego es mover todos los discos de una vara a la otra, de forma que al final se mantenga el mismo orden.
• Las reglas del juego son las siguientes:• Solo 1 disco puede ser movido a la vez.• No puede haber un disco más grande encima de uno más pequeño.• Un movimiento consiste en mover un disco en la cima de una pila de discos
hacia otra pila de discos puestos en otra vara.
• Nos interesa saber cuantos movimientos son necesarios para resolver el juego
![Page 35: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/35.jpg)
Clave: induccion
• Se trata de definir # hanoi int -> int# recibe el numero de argollas y responde con la # cantidad de movimientos necesarios para llevarlas a la estaca de mas a la derecha
def hanoi(n) :. . .
• Si tenemos un solo disco basta moverlo de la primera a la ultima barra
• Supongamos que sabemos como calcular hanoi(n-1), ¿ podemos escribir hanoi(n) en funcion de ella ?
![Page 36: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/36.jpg)
Clave: induccion• Primero necesitamos mover los n−1 discos anteriores a otra
vara, lo cual nos toma hanoi(n-1) movimientos.• Luego, debemos mover el disco más grande de su vara a la
desocupada, esto nos toma 1 movimiento.• A continuación, debemos volver a mover los n − 1 discos
restantes para que queden encima del disco grande que acabamos de mover. Esto nuevamente nos toma hanoi(n-1) movimientos.
• En total, necesitamos 2× hanoi(n-1) +1 movimientos para n discos
![Page 37: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/37.jpg)
El programa en Python
![Page 38: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/38.jpg)
Ejercicios Propuestos
• def suma(x,y) #x + (x+1) + … + y x <= y• def permutaciones(x,y) #x!/(x-y)!• def combinaciones(x,y) #x!/(y!(x-y)!)
• def inverso(x) #inverso(1234) entrega 4321
• Para la función potencia, agregar el caso cuando el exponente es negativo.
![Page 39: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/39.jpg)
(martes)
Leer capítulo 7 del apunte!!
Para la próxima clase
![Page 40: CC 1002: Introduccióna la Programación Recursión](https://reader035.vdocuments.pub/reader035/viewer/2022070923/62c804537549c267e73f6ae0/html5/thumbnails/40.jpg)
Felices Fiestas PatriasLes desea su
equipo docente