CC 1002 Introduccin a la Programacin Recursin Nelson

  • Slides: 25
Download presentation
CC 1002: Introducción a la Programación Recursión Nelson Baloian, José A. Pino

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

Factorial • El factorial de un número n se define como • n *

Factorial • El factorial de un número n se define como • n * (n – 1) * (n – 2) *. . . * 2 * 1 • Se puede definir recursivamente de la siguiente manera

Factorial en Python • El factorial de un número n se define como •

Factorial en Python • El factorial de un número n se define como • n * (n – 1) * (n – 2) *. . . * 2 * 1 • Se puede definir recursivamente de la siguiente manera

Operación de Factorial recursivo f(4)=4*f(3)=3*f(2)=2*f(1)=1*f(0) ← f(0)=1 ← f(1)=1 * 1=1 ← f(2)=2 *

Operación de Factorial recursivo f(4)=4*f(3)=3*f(2)=2*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

Potencia (recursivamente) • Definición recursiva de potencia • Cálculo :

Potencia (recursivamente) • Definición recursiva de potencia • Cálculo :

Potencia (recursivamente) • Caso base : • Caso recursivo :

Potencia (recursivamente) • Caso base : • Caso recursivo :

En Python

En Python

Solución más eficiente • xy = x xy-1 si y es impar • xy

Solución más eficiente • xy = x xy-1 si y es impar • xy = xy/2 si y es par def potencia(x, y): if y==0: return 1. 0 elif y%2==1: #impar? return x * potencia(x, y-1) else: aux=potencia(x, y/2) return aux*aux

Solución más eficiente 2 def potencia(x, y): if y==0: return 1. 0 aux=potencia(x, y/2)

Solución más eficiente 2 def potencia(x, y): if y==0: return 1. 0 aux=potencia(x, y/2) if y%2==0: return aux * aux else: return x * aux; • • Nota. Realiza log 2 y -1 llamadas recursivas (y no y-1) Ej: f(x, 17)-->f(x, 8)-->f(x, 4)-->f(x, 2)-->f(x, 1)-->f(x, 0) 5 llamadas (y no 16)

Los Números de Fibonacci • n Fn 0 0 1 1 2 1 3

Los Números de Fibonacci • n Fn 0 0 1 1 2 1 3 2 4 3 5 5 6 8 7 13

Los Números de Fibonacci

Los Números de Fibonacci

Las torres de Hanoi • Puzzle que consiste en mover todos los discos de

Las torres de Hanoi • Puzzle que consiste en mover todos los discos de un pilar a otro, bajo ciertas restricciones. El juego consta de una tabla con tres pilares y n discos puestos en orden decreciente de tamaño en una de ellas. El objetivo del juego es mover todos los discos de un pilar a otro, de forma que al final se mantenga el mismo orden.

Las torres de Hanoi • Las reglas del juego son las siguientes: • Sólo

Las torres de Hanoi • Las reglas del juego son las siguientes: • Sólo 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 otro pilar. • Nos interesa saber cuántos movimientos son necesarios para resolver el juego

Clave: inducción • Se trata de definir # hanoi int -> int # recibe

Clave: inducción • Se trata de definir # hanoi int -> int # recibe el numero de discos en pilar izq. y responde # con la cantidad de movimientos necesarios para # llevarlos al pilar de mas a la derecha def hanoi(n) : . . . • Si tenemos un sólo disco basta moverlo del primer al último pilar • Supongamos que sabemos como calcular hanoi(n -1), ¿podemos escribir hanoi(n) en función de ella?

Clave: inducción • Primero necesitamos mover los n− 1 discos anteriores a otro pilar,

Clave: inducción • Primero necesitamos mover los n− 1 discos anteriores a otro pilar, lo cual nos toma hanoi(n-1) movimientos. • Luego, debemos mover el disco más grande del pilar al desocupado, esto nos toma 1 movimiento. • A continuación, debemos volver a mover los n − 1 discos restantes para 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

El programa en Python

El programa en Python

Una función que no retorna valor Forma General de la instrucción if : if

Una función que no retorna valor Forma General de la instrucción if : if condicion : instrucción(es) else : intruccion(es)

Fractales Leer sección 6. 3 del apunte para otro ejemplo de recursión

Fractales Leer sección 6. 3 del apunte para otro ejemplo de recursión

Módulo turtle • Permite dibujar en la pantalla. • Tortuga dibuja una línea a

Módulo turtle • Permite dibujar en la pantalla. • Tortuga dibuja una línea a medida que avanza en el plano. • Se puede girar la dirección de la tortuga, indicando los grados del ángulo. • Se puede modificar la velocidad de avance.

turtle. forward(n) # se mueve n pixeles turtle. left(g) turtle. right(g) # gira a

turtle. forward(n) # se mueve n pixeles turtle. left(g) turtle. right(g) # gira a la izquierda g grados # gira a la derecha g grados turtle. speed(r) # pone la rapidez de la tortuga turtle. done() # no hay más acciones que hacer

Receta de diseño para recursión (1) 1. Escribir ejemplos de uso de la función

Receta de diseño para recursión (1) 1. Escribir ejemplos de uso de la función 2 potencia 0 es 1 2 potencia 4 es 16 2 potencia 3 es 8 2. Decidir cuál argumento va a ser recursivo En Potencia: el exponente 3. ¿Caso base? En Potencia: exponente 0

Receta de diseño para recursión (2) 4. Entender el paso recursivo, y cómo se

Receta de diseño para recursión (2) 4. Entender el paso recursivo, y cómo se descompone el problema Restar uno a la potencia; multiplicar 5. Poner nombre a cada componente de la solución “Base” y “potencia”

Receta de diseño para recursión (3) 6. Aplicar solución a un ejemplo i. 2

Receta de diseño para recursión (3) 6. Aplicar solución a un ejemplo i. 2 potencia 3 ii. Parámetros son 2 y 3; resultado es 8 iii. Los parámetros que son parte de la solución: 2 es la base, 3 es la potencia. iv. Respuesta para la llamada recursiva: la reducción consiste en reducir en 1 la potencia; llamada recursiva es 2 potencia 2 = 4 v. Combinación para respuesta final: resultado de 2 potencia 2 (4) se multiplica por base (2); resultado es 8. 7. Ocupar receta de diseño normal La función tiene un condicional: base y recursiva

Unos pocos problemas propuestos • • def suma(x, y) #x + (x+1) + …

Unos pocos problemas propuestos • • def suma(x, y) #x + (x+1) + … + y def permutaciones(x, y) #x!/(x-y)! def combinaciones(x, y) #x!/(y!(x-y)!) def inverso(x) #inverso(123) entrega 321

Para la clase del jueves Leer capítulo 7 del apunte!!

Para la clase del jueves Leer capítulo 7 del apunte!!