Recursividad. Introducción a la programación

Documentos relacionados
Recursividad. Introducción a la programación

Recursividad. Introducción a la programación

Recursividad... un análisis posterior. Aurelio Sanabria Introducción a la programación

Primeros Pasos en Python 3 Parte II. Introducción a la programación

Recursividad... un análisis posterior. Jaime Gutiérrez Alfaro Introducción a la programación

Programación 2. Lección 3. Introducción a la recursividad

Introducción a Sistemas numéricos. Taller de programación

Primeros Pasos en Python 3

Funciones recursivas

Estructuras de datos, vectores y matrices. Introducción a la programación

Qué es la recursividad?

Metodología de la Programación II. Recursividad

Listas y Recursión. Taller de Álgebra I. Primer Cuatrimestre de 2015

Recursión. Capítulo 4

Sistemas numéricos - otras representaciones - Taller de programación

Programación I Recursividad.

UNIVERSIDAD DE LOS ANDES NUCLEO UNIVERSITARIO RAFAEL RANGEL (NURR) DEPARTAMENTO DE FISICA Y MATEMATICA AREA COMPUTACION TRUJILLO EDO.

Programación II Recursividad Dr. Mario Rossainz López

Sistemas numéricos -aritmética- Taller de programación

Recursividad Definición

Análisis de algoritmos. Recursividad

Tema: Funciones, Procedimientos y Recursividad en C#.

Tema: Funciones, Procedimientos y Recursividad en C#.

Tema: Funciones, Procedimientos y Recursividad en C#.

RECURSIVIDAD. Prof. Ing. M.Sc. Fulbia Torres

Tema 4.- Recursión e iteración

Ejercicios sobre recursividad

Tema: Funciones, Procedimientos y Recursividad en C#.

Tema: Programación Dinámica.

Complejidad de algoritmos recursivos

Unidad 2 Recursividad. 2.1 Definición 2.2 Procedimientos Recursivos 2.3 Ejemplos de Casos Recursivos

Tema 7: Recursividad

Algoritmos y Estructuras de Datos Tema 2: Diseño de Algoritmos

Introducción a Python. Cecilia Manzino

Unidad 2 Recursividad. 2.1 Definición 2.2 Procedimientos Recursivos 2.3 Ejemplos de Casos Recursivos

Práctica 5.- Recursividad

La recursividad forma parte del repertorio para resolver problemas en Computación y es de los métodos más poderosos y usados.

Departamento de Informática Universidad de Valladolid Campus de Segovia TEMA 1: RECURSIÓN

Trabajo Práctico Nº 06

Subrutinas. Subrutinas. Erwin Meza Vega

Para entender la recursividad primero tenemos que entender la recursividad

Para el Segundo Parcial

Estructura de Datos. Recursividad. Primer Semestre, Indice

TECNICAS DE PROGRAMACION Universidad Católica Los Angeles de Chimbote RECURSIVIDAD Y SOBRECARGA DE METODOS

Dra. Jessica Andrea Carballido

ESTRUCTURA DE DATOS: Tema 3. Recursividad

Universidad de Valladolid. Departamento de informática. Campus de Segovia. Estructura de datos Tema 1: Recursividad. Prof. Montserrat Serrano Montero

Recursividad. 1.1 Concepto de Recursividad. Objetivos. Metodología de la Programación II Entender el concepto de recursividad.

4.1 Definición. Se dice que algo es recursivo si se define en función de sí mismo o a sí mismo. Un objeto (problemas, estructuras de datos) es

Unidad 1. Análisis de Algoritmos. Ing. Leonardo R. L. Estructura de datos - Generalidades Unidad I Pág 1

Recursividad. Dept. Ciencias de la Computación e I.A. Universidad de Granada

Tema 06: Recursividad

Capítulo 4. Control de flujo. Continuar

Algoritmos y Estructuras de Datos: Introducción a la Recursión de Programas. Guillermo Román Díez

PROGRAMACION ESTRUCTURADA: Tema 3. Funciones

UNIDAD 7: PROGRAMACIÓN EN R

Sección III CRITERIOS DE DIVISIBILIDAD I (Criterios Habituales)

RECURRENCIA RECURSIÓN o RECURSIVIDAD

Un calculadora avanzada... y algo más!

Manual rápido para evaluación de series en Python

ESTRUCTURA DE DATOS: Tema 3. Recursividad

import math # Importa la libreria math, que permite utilizar operaciones y funciones matematicas

Programación Unidad 5. Recursividad. Programación TIG - TUP 1. Sede Regional Orán UNIVERSIDAD NACIONAL DE SALTA

M.C. Yolanada Moyao Martínez

PROGRAMACIÓN PLAN 2008

Funciones Tipos de funciones y Recursividad

Recursividad. Definición. Diseño de Algoritmos Recursivos

Programación 1 Tema 5. Instrucciones simples y estructuradas

Resolución de Problemas y Algoritmos

Informática Aplicada I

Resolución de problemas

Guía práctica de estudio 03: Algoritmos

Luis Rodríguez Baena Universidad Pontificia de Salamanca Escuela Superior de Ingeniería y Arquitectura

UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS ESCUELA DE COMPUTACION

Carlos A. Rivera-Morales. Precálculo 2

Transcripción:

Recursividad Introducción a la programación I semestre, 2016

Recursividad Las reglas fundamentales para resolver problemas recursivos: Definir el caso base (solución trivial) Cuál es la solución que no necesita procesamiento adicional? Definir llamadas recursivas (solución de problema más pequeño) Aportar una respuesta parcial (salida) y reducir el tamaño o la complejidad del problema modificando los argumentos con la intensión de que tiendan al caso base. Me recursive pointing CC SA dnisbet @ Flickr

Afinando detalles Volvamos a la función num_digitos(numero) y analicemos de forma crítica e ingenieril: Qué problemas tiene en términos de eficiencia? Qué problemas hay con las validaciones (restricciones)? Ei Ingeniero! Cómo podemos afinar estos detalles? Bad Boss CC NC-SA ErickHerbert @ Flickr

Recursividad eficiente Las reglas fundamentales para resolver problemas recursivos de forma eficiente: La validación de las restricciones generales o casos especiales pueden/deben ser trabajados en la función principal (no recursiva). Este es el punto de entrada a nuestro problema, es ahí donde nos aseguraremos que los datos son correctos. El trabajo pesado puede/debe ser resuelto en una función auxiliar (recursiva) que será invocada por la principal. Este es el núcleo, cuore o corazón de la solución

def num_digitos2(numero): #se evalúa solo una vez if not isinstance(numero,int): return 'Error01' elif numero == 0: #caso especial... return 1 else: return num_digitos2_aux(abs(numero)) def num_digitos2_aux(numero): if(numero == 0): #caso base return 0 else: #función recursiva con argumentos 'mas pequeños' return 1 + num_digitos2_aux(numero //10)

Cómo se ejecuta num_digitos2? >>> num_digitos2(-4925) num_digitos2_aux(4925) # abs(-4925) = 4925 1 + num_digitos2_aux(492) # 4925 // 10 = 492 1 + 1 + num_digitos2_aux(49) # 492 // 10 = 49 1 + 1 + 1 + num_digitos2_aux(4) # 49 // 10 = 4 1 + 1 + 1 + 1 + num_digitos2_aux(0) # 4 // 10 = 0 1 + 1 + 1 + 1 + 0 # numero = 0 >>> 4 >>> num_digitos2(0) >>> 1 # caso especial

Finite staircase CC BY-SA gadl @ Flickr

Consejos... Identifique el o los casos más sencillos a resolver. (casos base) Cual es la condición que debería llevarnos al caso base? Qué debe retornar ese caso? los resultados (return) serán resultados finales o parciales? Busque la forma de hacer el problema más pequeño Hasta ahora los problemas nos pedían reducir el número quitándole dígitos, pero no siempre será así. Identifique casos de prueba que incluyan a los casos sencillos y otros complejos y evalúe utilizando papel y lápiz qué es lo que está haciendo Python. Comente la función num_digitos siguiendo estos consejos: casos base, resultados parciales, finales y donde finaliza el programa.

Sucesión de Fibonacci Leonardo de Pisa Inicia con f(0) = 0 y f(1) = 1, y a partir de ahí cada elemento es la suma de los dos anteriores. De forma formal, para todo n en los Naturales. fibonacci(n) fibonacci(0), si n = 0 0 fibonacci(1), si n = 1 1 fibonacci(n), si n >= 2 fibonacci( n - 1) + fibonacci( n - 2) Encontrar: Entradas, salidas, restricciones. Caso base, soluciones parciales, finales, casos de prueba. Hagan una corrida del programa en papel, prestando especial atención a la pila de llamadas.

Recursive Road Sign CC BY-SA gadl @ Flickr

Ejercicios 4. Hacer una función que cuente las veces que aparece un dígito en un número: >>> cuenta_digito(8486, 8) 2 >>> cuenta_digito(8486, 0) 0 5. La función Factorial se define como: Haga una función recursiva para resolver el factorial de cualquier número entero positivo. >>> factorial(0) 1 >>>factorial(1) 1 >>>factorial(7) 5040

Ejercicios 6. construya un número nuevo con los dígitos pares de un número recibido como parámetro de la función: >>> pares(486) 486 >>> pares(175043) 4 Piense en el algoritmo y trate de descomponer el problema en otros pequeños Cuales serían? Recuerde hacer validaciones: en este caso el número que recibe la función debe ser entero. En caso de que no se cumpla entonces se debe retornar el mensaje 'Error'

Ejercicios 7. Un número es palíndromo si puede leerse igual de izquierda a derecha o de derecha a izquierda, escriba una función para determinar esta propiedad. Sintaxis: palindromo(numero) salida donde: numero es numero entero positivo y salida debe ser un valor booleano: True o False. >>> palindromo(38583) >>> palindromo(1010010) True False >>> palindromo(2442) >>> palindromo(101) True 'Error' >>> palindromo(4) >>> palindromo(101) True True

Las presentaciones para el curso IC-1800: "Introducción a la Programación" por Ing. En Computación Alajuela se distribuyen bajo una Licencia Creative Commons Atribución-Compartir Igual 3.0 Costa Rica. 15 http://creativecommons.org/licenses/by-sa/3.0/cr/ http://creativecommons.org/licenses/by-sa/3.0/cr/ *La licencia de la presentación no cubre las imágenes utilizadas*

Recursividad Introducción a la programación I semestre, 2016

Recursividad Las reglas fundamentales para resolver problemas recursivos: Definir el caso base (solución trivial) Cuál es la solución que no necesita procesamiento adicional? Definir llamadas recursivas (solución de problema más pequeño) Aportar una respuesta parcial (salida) y reducir el tamaño o la complejidad del problema modificando los argumentos con la intensión de que tiendan al caso base. Me recursive pointing CC SA dnisbet @ Flickr

Afinando detalles Volvamos a la función num_digitos(numero) y analicemos de forma crítica e ingenieril: Qué problemas tiene en términos de eficiencia? Qué problemas hay con las validaciones (restricciones)? Ei Ingeniero! Cómo podemos afinar estos detalles? Bad Boss CC NC-SA ErickHerbert @ Flickr Que problemas hay en términos de eficiencia: - siempre se validan las restricciones, (ineficiente en tiempo y consumo de recursos) pues con solo que validemos 1 vez, YA sabemos con toda certeza que los datos de entrada seguirán siendo válidos.

Recursividad eficiente Las reglas fundamentales para resolver problemas recursivos de forma eficiente: La validación de las restricciones generales o casos especiales pueden/deben ser trabajados en la función principal (no recursiva). Este es el punto de entrada a nuestro problema, es ahí donde nos aseguraremos que los datos son correctos. El trabajo pesado puede/debe ser resuelto en una función auxiliar (recursiva) que será invocada por la principal. Este es el núcleo, cuore o corazón de la solución

def num_digitos2(numero): #se evalúa solo una vez if not isinstance(numero,int): return 'Error01' elif numero == 0: #caso especial... return 1 else: return num_digitos2_aux(abs(numero)) def num_digitos2_aux(numero): if(numero == 0): #caso base return 0 else: #función recursiva con argumentos 'mas pequeños' return 1 + num_digitos2_aux(numero //10)

Cómo se ejecuta num_digitos2? >>> num_digitos2(-4925) num_digitos2_aux(4925) # abs(-4925) = 4925 1 + num_digitos2_aux(492) # 4925 // 10 = 492 1 + 1 + num_digitos2_aux(49) # 492 // 10 = 49 1 + 1 + 1 + num_digitos2_aux(4) # 49 // 10 = 4 1 + 1 + 1 + 1 + num_digitos2_aux(0) # 4 // 10 = 0 1 + 1 + 1 + 1 + 0 # numero = 0 >>> 4 >>> num_digitos2(0) >>> 1 # caso especial

Finite staircase CC BY-SA gadl @ Flickr http://www.flickr.com/photos/gadl/253426762/in/set72157594316295785 El camino para comprender recursión es largo, inclusive puede verse empinado, con unas gradas eternas, pero habrá una caso base que sea subir una grada con el pie derecho y comenzar a caminar con el izquerdo.

Consejos... Identifique el o los casos más sencillos a resolver. (casos base) Cual es la condición que debería llevarnos al caso base? Qué debe retornar ese caso? los resultados (return) serán resultados finales o parciales? Busque la forma de hacer el problema más pequeño Hasta ahora los problemas nos pedían reducir el número quitándole dígitos, pero no siempre será así. Identifique casos de prueba que incluyan a los casos sencillos y otros complejos y evalúe utilizando papel y lápiz qué es lo que está haciendo Python. Comente la función num_digitos siguiendo estos consejos: casos base, resultados parciales, finales y donde finaliza el programa. Potencias: X (elevado a la )3 = x * x * x - X elevado a la 1 es X -X0 Hagamos un algoritmo para entender la recursividad: - caso base: entendemos recursividad - sino seguir haciendo práctica

Sucesión de Fibonacci Leonardo de Pisa Inicia con f(0) = 0 y f(1) = 1, y a partir de ahí cada elemento es la suma de los dos anteriores. De forma formal, para todo n en los Naturales. fibonacci(n) fibonacci(0), si n = 0 0 fibonacci(1), si n = 1 1 fibonacci(n), si n >= 2 fibonacci( n - 1) + fibonacci( n - 2) Encontrar: Entradas, salidas, restricciones. Caso base, soluciones parciales, finales, casos de prueba. Hagan una corrida del programa en papel, prestando especial atención a la pila de llamadas. Acá el video: Nature by NumberskkGeOWYOFoA.mp4

Recursive Road Sign CC BY-SA gadl @ Flickr http://www.flickr.com/photos/gadl/272562772/ Cuidado: camino estrecho... la recursividad tiende a ser un embudo para mucha gente al aprender a programar

Ejercicios 4. Hacer una función que cuente las veces que aparece un dígito en un número: >>> cuenta_digito(8486, 8) 2 >>> cuenta_digito(8486, 0) 0 5. La función Factorial se define como: Haga una función recursiva para resolver el factorial de cualquier número entero positivo. >>> factorial(0) 1 >>>factorial(1) 1 >>>factorial(7) 5040

Ejercicios 6. construya un número nuevo con los dígitos pares de un número recibido como parámetro de la función: >>> pares(486) 486 >>> pares(175043) 4 Piense en el algoritmo y trate de descomponer el problema en otros pequeños Cuales serían? Recuerde hacer validaciones: en este caso el número que recibe la función debe ser entero. En caso de que no se cumpla entonces se debe retornar el mensaje 'Error' Acá hay dos problemas 1. dado un dígito saber si es par o no. (que se podría generalizar para saber si un número es par o no). es_par() un dígito //2, si el residuo es cero quierec decir que es divisible exacto entre dos 2. crear el nuevo número, utilizando un factor

Ejercicios 7. Un número es palíndromo si puede leerse igual de izquierda a derecha o de derecha a izquierda, escriba una función para determinar esta propiedad. Sintaxis: palindromo(numero) salida donde: numero es numero entero positivo y salida debe ser un valor booleano: True o False. >>> palindromo(38583) >>> palindromo(1010010) True False >>> palindromo(2442) >>> palindromo(101) True 'Error' >>> palindromo(4) >>> palindromo(101) True True

Las presentaciones para el curso IC-1800: "Introducción a la Programación" por Ing. En Computación Alajuela se distribuyen bajo una Licencia Creative Commons Atribución-Compartir Igual 3.0 Costa Rica. 15 http://creativecommons.org/licenses/by-sa/3.0/cr/ http://creativecommons.org/licenses/by-sa/3.0/cr/ *La licencia de la presentación no cubre las imágenes utilizadas*