Recursividad. Introducción a la programación

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

Recursión. Capítulo 4

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

Ejercicios sobre recursividad

Tema: Funciones, Procedimientos y Recursividad en C#.

Guía práctica de estudio 03: Algoritmos

Tema 7: Recursividad

Guía práctica de estudio 03: Algoritmos

Si un número es múltiplo de otro, u dicho de forma, comprobar si un número es divisor de otro.

Estructuras de Datos y de la Información Ingeniería Técnica en Informática de Gestión. Curso 2007/2008 Ejercicios del Tema 2

Recuerdas la reunión social del sexto grado del concepto anterior?

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

RECURRENCIA RECURSIÓN o RECURSIVIDAD

1.- Para cada uno de los siguientes problemas escribir el diagrama de flujo y el pseudocódigo de un programa que lo resuelva:

Funciones Tipos de funciones y Recursividad

Tema I Testing Estructurado

Tecnología de la Programación

Carlos A. Rivera-Morales. Precálculo 2

SISTEMAS INFORMÁTICOS PROGRAMACION I - Contenidos Analíticos Ing. Alejandro Guzmán M. TEMA 2. Diseño de Algoritmos

Concepto de Recursión. Características de algoritmos recursivos. Ejemplos

RECORDAR TIPOS DE DATOS

Tutorial MT-b1. Matemática Tutorial Nivel Básico. Elementos básicos de Aritmética

Complejidad computacional (Análisis de Algoritmos)

ESTRUCTURAS DE CONTROL

Algoritmos y programas. Algoritmos y Estructuras de Datos I

MATEMÁTICAS 2º DE ESO LOE

Tema 01: Algoritmia y diagramas de flujo. Estructuras de datos (Prof. Edgardo A. Franco)

#include <stdio.h> float cubica(float numero) { float cubica; cubica = numero * numero * numero; return cubica; }

Tema: Estructuras de Selección en C#.

DIVISIBILIDAD NÚMEROS NATURALES

GUÍA BÁSICA DE SCHEME v.4

Sentencias de Procesamiento Iterativo: while y do-while

Estatutos de Control C# Estatutos de Decisión (Selección)

Sistemas numéricos (decimal, binario, octal, hexadecimal)

= 310 (1 + 5) : 2 2 = = = 12 ( 3) ( 5) = = 2 = ( 4) + ( 20) + 3 = = 21

Programación en Lenguaje Java

Programación I. Ingeniería Técnica Informática. Ejercicios de los Temas 4, 5, 6 y 7

Programación Dinámica

Para las ecuaciones diferenciales ordinarias no lineales no existen métodos generales.

TEMA 1 NÚMEROS NATURALES

Tipos algebraicos y abstractos. Algoritmos y Estructuras de Datos I. Tipos algebraicos

Algoritmos. Medios de expresión de un algoritmo. Diagrama de flujo

Ejercicios Tema 6. Funciones

FACULTADE DE INFORMÁTICA Departamento de Computación Estructura de Datos e da Información. Ejercicios de recursividad

DIVISIBILIDAD: Resultados

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

Guía práctica de estudio 05: Diagramas de flujo

Módulo 2: Algoritmos (continuación)

Estructuración del programa en partes más pequeñas y sencillas

funciones printf scanf

PROGRAMA DE ASIGNATURA DE PROGRAMACIÓN I

Introducción a los Computadores (CNM-130) Estructuras de control repetitivas en FreeMat

Isabelle como un lenguaje funcional

Ejercicios Pendientes Matemáticas 2º ESO Curso Números Enteros Los Números Enteros

Trabajo Práctico N 9 Recursividad

Programación 1 - Práctica 0, recargada.

UNIDAD DE APRENDIZAJE II UNIDAD DE APRENDIZAJE 2 ( 12 HORAS)

Unidad #1: DESIGUALDAD o inecuaciones COLEGIO BENIGNO TOMÁS ARGOTE UNIDAD # 1

TEMA 2: TEORÍA DE CONJUNTOS Y CONJUNTOS NUMÉRICOS.

La raíz n-ésima de un número, es. Y, al igual que la simplificación de las raíces cuadradas, podemos simplificar las raíces n-ésimas.

Tarea 2 de Álgebra Superior II

2007/ PROGRAMACIÓN. Tipo: TRO Curso: 1 Semestre: AB CREDITOS Totales TA TS AT AP PA OBJETIVOS. 1.-Introducción.

La Tabla 1 muestra los valores de los dígitos de un número binario.

Materia: Matemática de Tercer Año Tema: Pendiente

Java Básico. Métodos estáticos

Unidad didáctica 1. Operaciones básicas con números enteros

Actividad colaborativa Ejercicios de programación Programación básica C++

Pauta Guía de Ejercicios N 1

Tema 6. Reutilización de código. Programación Programación - Tema 6: Reutilización de código

ARREGLOS EN. Nota: El autor.

RADIO =? R AREA = : πr 2 < CIRC = : 2 πr

Propiedades de números enteros (lista de problemas para examen)

Clase 1: Primalidad. Matemática Discreta - CC3101 Profesor: Pablo Barceló. P. Barceló Matemática Discreta - Cap. 5: Teoría de números 1 / 32

Objetivos de la sesión. Aplicación de consola 7/30/11. Código con que se inicia un programa en Visual C# (aplicación de consola)

Tema 11. Diseño de algoritmos recursivos 1. Tema 11. Diseño de algoritmos recursivos

Funciones como parámetros, funciones como resultados. Introducción a la Computación Patricia Borensztejn Clase 26

Programación Funcional Lisp-DrScheme Primera Parte. Dr. Oldemar Rodríguez Rojas Escuela de Informática Universidad de Nacional

Formatos para prácticas de laboratorio

TEMA 5: Subprogramas, programación modular

Estructuras de Control (y su forma en Python y en C) Clase 5 Introducción a la Computación Patricia Borensztejn

Complejidad de los Algoritmos

UNIVERSIDAD NACIONAL EXPERIMENTAL DE GUAYANA VICERRECTORADO ACADÉMICO COORDINACION DE PRE-GRADO PROYECTO DE CARRERA DE INGENIERIA INDUSTRIAL

la solución a una ecuación cuadrática solicitando al usuario los términos de dicha ecuación.

Dirección de Operaciones

Semana de las Matemáticas e Ingeniería. Desarrollo de algoritmos recursivos empleando la aplicación PseInt

9 Expresiones racionales

CURSO CERO DE MATEMATICAS. Apuntes elaborados por Domingo Pestana Galván. y José Manuel Rodríguez García

Lógica Proposicional IIC1253. IIC1253 Lógica Proposicional 1/64

Transcripción:

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

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? Me recursive pointing CC SA dnisbet @ Flickr

Recursividad 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 Ingenier@! 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.

Recursividad eficiente Las reglas fundamentales para resolver problemas recursivos de forma eficiente: El trabajo pesado puede/debe ser resuelto en una función auxiliar (recursiva) que será invocada por la principal. Este es el núcleo, core 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?

Consejos... 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.

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)

Sucesión de Fibonacci Leonardo de Pisa 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

Ejercicios 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

Ejercicios 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. 21 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, 2017

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? Me recursive pointing CC SA dnisbet @ Flickr

Recursividad 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 Ingenier@! 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.

Recursividad eficiente Las reglas fundamentales para resolver problemas recursivos de forma eficiente: El trabajo pesado puede/debe ser resuelto en una función auxiliar (recursiva) que será invocada por la principal. Este es el núcleo, core 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? 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

Consejos... 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

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) Acá el video: Nature by NumberskkGeOWYOFoA.mp4

Sucesión de Fibonacci Leonardo de Pisa 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

Ejercicios 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 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 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. 21 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*