40
CC 1002: Introducción a la Programación Recursión Nelson Baloian, José A. Pino

CC 1002: Introduccióna la Programación Recursión

  • Upload
    others

  • View
    12

  • Download
    0

Embed Size (px)

Citation preview

Page 1: CC 1002: Introduccióna la Programación Recursión

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

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

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

Factorial en Python

Page 5: CC 1002: Introduccióna la Programación Recursión

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

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

Potencia (recursivamente)

1 0· 0

Caso Base

Caso Recursivo

Page 8: CC 1002: Introduccióna la Programación Recursión

En Python

Page 9: CC 1002: Introduccióna la Programación Recursión

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

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

¿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

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

Fibonacci (paréntesis)

Patrón de crecimiento de las ramas de una planta

Page 14: CC 1002: Introduccióna la Programación Recursión

En Python

Page 15: CC 1002: Introduccióna la Programación Recursión

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

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

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

Modulo Turtle (Ejemplos)>>> import turtle>>> turtle.forward(100)

Page 19: CC 1002: Introduccióna la Programación Recursión

Modulo Turtle (Ejemplos)>>> import turtle>>> turtle.forward(100)>>> turtle.left(90)

Page 20: CC 1002: Introduccióna la Programación Recursión

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

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

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

Modulo Turtle (Funciones)

>>> Cuadrado(100)

Page 24: CC 1002: Introduccióna la Programación Recursión

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

Fractales

Page 26: CC 1002: Introduccióna la Programación Recursión

Fractales

Page 27: CC 1002: Introduccióna la Programación Recursión

Fractales

Page 28: CC 1002: Introduccióna la Programación Recursión

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

Copo de nieve de Koch

Base Nivel 1 Nivel 2 Nivel 3

Generador

Page 30: CC 1002: Introduccióna la Programación Recursión

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

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

Copo de nieve (Código)

Page 33: CC 1002: Introduccióna la Programación Recursión

Copo de nieve (Código)

>>> snowflake(320,3)

Page 34: CC 1002: Introduccióna la Programación Recursión

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

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

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

El programa en Python

Page 38: CC 1002: Introduccióna la Programación Recursión

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

(martes)

Leer capítulo 7 del apunte!!

Para la próxima clase

Page 40: CC 1002: Introduccióna la Programación Recursión

Felices Fiestas PatriasLes desea su

equipo docente