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

Documentos relacionados
Algoritmos y programas. Algoritmos y Estructuras de Datos I

Tema 3: Tipos y clases

Tema 3: Tipos y clases

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

Isabelle como un lenguaje funcional

Tema 11. Listas infinitas

Introducción a los Algoritmos Validez, Satisfactibilidad, Tipos y Funciones

Tema 7. El sistema de clases

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

Funciones. Parámetros por valor

DEPARTAMENTO DE MATEMATICAS Y FISICA Matemáticas Discreta

Carlos A. Rivera-Morales. Precálculo 2

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

Recursión Directa. Una función es de recursión directa si contiene una llamada explícita a si misma. return foo (y 1); Recursión Indirecta

Estructuras de Control. Secuencia y Selección

5. Subprogramas Fundamentos de Informática

Programación Funcional Haskell Clase 21

Estructuras de Datos. Dr. Pablo E. Fidel Martínez López Lic. en Ciencias de la Computación UNR

Ejercicios de programación funcional con Haskell

Inducción Matemática. Departamento de Matemáticas. Inducción Matemática p. 1/31

Alonso Ramírez Manzanares Computación y Algoritmos 10.03

Programación Funcional en Haskell

Tema 13: Aplicaciones de programación funcional

Estructuras de control

Programación de Computadores 4 Iteraciones y Decisiones. Prof. Javier Cañas. Universidad Técnica Federico Santa María Departamento de Informática

FUNDAMENTOS DE INFORMÁTICA

Programación Dinámica 1

Cursada Segundo Cuatrimestre 2012 Guía de Trabajos Prácticos Nro. 1

Problemas de Recursividad

Tema 11.- Autovalores y Autovectores.

Algoritmos. Intro. Prof. Raquel Torres Peralta / Gerardo Sanchez S. Unison

Fracciones y fractales

Clase adicional 2. Estructuras básicas de control. Temas

Números naturales, principio de inducción

Estructuras de Repetición (Hacer-Mientras)

Solución - práctico 10

Funciones Tipos de funciones y Recursividad

Programación Orientada a Objetos Métodos Guía de Ejercicios v9.7

PROBLEMAS DEL TEMA 7: Subprogramas y Modularidad

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

ESCUELA POLITÉCNICA SUPERIOR PRÁCTICA 2: EXPRESIONES, PRINTF Y SCANF

Guía 2: Funciones, listas, recursión e inducción

$0 Representa al parámetro cero o nombre del programa $1 Representa al parámetro uno $2 Representa al parámetro dos

Prácticas para Resolver PROBLEMAS MATEMÁTICOS

Modelos de Desarrollo de Programas Y Programación Concurrente Clase N 3

TI 89. Cómo sobrevivir en Precálculo

Algoritmos glotones. mat-151

Metodología de la Programación II. Recursividad

TEMA 3 POTENCIAS Y RAÍCES

Taller de Informática I Dpto. Computación F.C.E. y N. - UBA 2010

Especificación y uso de módulos en C++(II)

Unidad 2: Ecuaciones, inecuaciones y sistemas.

Cómo resolver? Veremos dos métodos

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

Control de Flujo. Estructuras de Control! Experiencia Educativa de Algorítmica CONTROL DE FLUJO

MATE EJERCICIOS DE PRACTICA

Diferenciabilidad en un intervalo

10.4 Sistemas de ecuaciones lineales

Introduc)on to Programming (in C++) Ejemplos de tratamiento de secuencia de secuencias. Emma Rollón Departament of Computer Science

Estrategias de Diseño de Algoritmos

Escuela Politécnica Superior de Ingeniería Departamento de Ingeniería Informática

Tema 2: Introducción a la programación con Haskell

7.1 Consideraciones. Considere la búsqueda de un libro en una biblioteca. Considere la búsqueda de un nombre en el directorio telefónico.

2^10 2^9 2^8 2^7 2^6 2^5 2^4 2^3 2^2 2^1 2^0 SUMA

ƒ : {(1, 4), (2, 5), (3, 6), (4, 7)}.

El lenguaje C. 1. Identificadores, constantes y variables

Taller de Resolución de Problemas Computacionales

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

Métodos que devuelven valor Dado el siguiente triángulo rectángulo:

data Tree a = Tip Node a (Tree a) (Tree a) deriving Show

GUÍA BÁSICA DE SCHEME v.4

Aplicaciones en Haskell. Funciones, funciones recursivas y su implementación en Haskell.

MATRICES. Se simboliza tal matriz por y se le llamará una matriz x o matriz de orden x (que se lee por ).

Laboratorio de Física Universitaria 2 otoño 1998 Alicia M. Vázquez Soto. Campo Eléctrico

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

1.3.- V A L O R A B S O L U T O

Base y Dimensión de un Espacio Vectorial

Resolución de Problemas y Algoritmos Clase 6: Repetición (continuación)

Euclides extendido y Test de primalidad probabiĺıstico

Notación Asintótica 2

Nota 2. Luis Sierra. Marzo del 2010

a) Factoriza el monomio común. En este caso 6 se puede dividir de cada término:

1. Cuántas sentencias hay en la secuencia principal del siguiente programa?

EJERCICIOS DE LENGUAJES Y PARADIGMAS DE PROGRAMACIÓN (CUESTIONES DE EXAMEN) PROGRAMACIÓN FUNCIONAL

Ejercicios (Números reales)

Introducción a la Geometría Computacional. Análisis de Algoritmos

Introducción a C++ y Code::Blocks

UNIDAD 2. Logaritmos DEFINICION DE LOGARITMO. Definiciones:

4.1. Determinante de una matriz cuadrada de orden 2. , entonces el determinante de A es a 21 a 22 a 11 a 12 = a 11a 22 a 12 a 21

Tema 4: Procedimientos y estructuras recursivas

DIAGRAMAS DE FLUJOS. Qué son Los Diagramas de Flujo y Para qué se Usan?

Tipos de datos en S. Lógica y Computabilidad. Codificación de variables y etiquetas de S. Codificación de programas en S

Enteros (Z):..., -3, -2, -1, 0, 1, 2, 3,... Números enteros (positivos o negativos), sin decimales. Incluye a los naturales.

SESIÓN N 07 III UNIDAD RELACIONES Y FUNCIONES

funciones printf scanf

Eje temático: Álgebra y funciones Contenidos: Raíces cuadradas y cúbicas - Racionalización Ecuaciones irracionales. Nivel: 3 Medio

Introducción al lenguaje C

Semana03[1/17] Funciones. 16 de marzo de Funciones

Aspectos y ejercicios a trabajar en el taller

Estrategias didácticas para la resolución de problemas en Matemática de I y II ciclos

Transcripción:

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

Un nuevo tipo: Listas Tipo Lista Las listas pueden contener elementos de cualquier tipo (incluso listas) [1] :: [Integer] [1, 2] :: [Integer] [1.1, 2, 4, 3.2] :: [Float] [[1], [2,3], [], [1,1000,2,0]] :: [[Integer]] [1, a ] NO ES UNA LISTA VÁLIDA, por qué?

Un nuevo tipo: Listas Tipo Lista Las listas pueden contener elementos de cualquier tipo (incluso listas) [1] :: [Integer] [1, 2] :: [Integer] [1.1, 2, 4, 3.2] :: [Float] [[1], [2,3], [], [1,1000,2,0]] :: [[Integer]] [1, a ] NO ES UNA LISTA VÁLIDA, por qué? Tipar las siguientes expresiones [(1,2), (3,4), (5,2)] [maximo 2 3, fst (2+2, 3+4), 3+4-3/4] [ [], [], [], [], [] ] [] [if True then False else True, 3 > 3 && 4 < 2] [undefined]

Ejercicios Otras formas de definir listas Prueben las siguientes expresiones en GHCI [1..100] [1,3..100] [100..1] Cómo harían la lista que va entre 1 y -100?

Ejercicios Otras formas de definir listas Prueben las siguientes expresiones en GHCI [1..100] [1,3..100] [100..1] Cómo harían la lista que va entre 1 y -100? Definir las siguientes funciones listar :: a -> a -> a -> [a] que toma 3 elementos y los convierte en una lista. rangodepaso :: Integer -> Integer -> Integer -> [Integer] que, dados 3 números (n1, n2, n3), devuelve la lista resultante de crear el rango con bordes n1 y n2 (inclusive) y paso n3

Operaciones Algunas operaciones head :: [a] -> a tail :: [a] -> [a] (:) :: a -> [a] -> [a] (++) :: [a] -> [a] -> [a] length :: [a] -> Int reverse :: [a] -> [a]

Operaciones Algunas operaciones head :: [a] -> a tail :: [a] -> [a] (:) :: a -> [a] -> [a] (++) :: [a] -> [a] -> [a] length :: [a] -> Int reverse :: [a] -> [a] Tipar y reducir las siguientes expresiones head [(1,2), (3,4), (5,2)] tail [1,2,3,4,4,3,2,1] head [] head [1,2,3] : [2,3] [True, True] ++ [False, False] [1,2] : []

Recursión Hasta ahora, especificamos funciones que consistían en expresiones sencillas. Sin embargo, el tipo de funciones que hicimos hasta la clase pasada no permite programar todas las funciones computables.

Recursión Hasta ahora, especificamos funciones que consistían en expresiones sencillas. Sin embargo, el tipo de funciones que hicimos hasta la clase pasada no permite programar todas las funciones computables. Por ejemplo, cómo es una función en Haskell para calcular el factorial de un número entero?

Recursión Hasta ahora, especificamos funciones que consistían en expresiones sencillas. Sin embargo, el tipo de funciones que hicimos hasta la clase pasada no permite programar todas las funciones computables. Por ejemplo, cómo es una función en Haskell para calcular el factorial de un número entero? n! = n k k=1

Recursión Hasta ahora, especificamos funciones que consistían en expresiones sencillas. Sin embargo, el tipo de funciones que hicimos hasta la clase pasada no permite programar todas las funciones computables. Por ejemplo, cómo es una función en Haskell para calcular el factorial de un número entero? n! = n k, n! = k=1 { 1 si n = 0 n (n 1)! si no

Recursión Hasta ahora, especificamos funciones que consistían en expresiones sencillas. Sin embargo, el tipo de funciones que hicimos hasta la clase pasada no permite programar todas las funciones computables. Por ejemplo, cómo es una función en Haskell para calcular el factorial de un número entero? n! = n k, n! = k=1 { 1 si n = 0 n (n 1)! si no La segunda definición de factorial involucra a esta misma función del lado derecho!

Definiciones recursivas

Definiciones recursivas factorial :: Int -> Int

Definiciones recursivas factorial :: Int -> Int factorial n n == 0 =

Definiciones recursivas factorial :: Int -> Int factorial n n == 0 = 1

Definiciones recursivas factorial :: Int -> Int factorial n n == 0 = 1 factorial n n > 0 =

Definiciones recursivas factorial :: Int -> Int factorial n n == 0 = 1 factorial n n > 0 = n * factorial (n-1)

Definiciones recursivas Propiedades de una definición recursiva: 1 Tiene que tener uno o más casos base. 2 Las llamadas recursivas del lado derecho tienen que acercarse al caso base, con relación a los parámetros del lado izquierdo de la ecuación.

Definiciones recursivas Propiedades de una definición recursiva: 1 Tiene que tener uno o más casos base. 2 Las llamadas recursivas del lado derecho tienen que acercarse al caso base, con relación a los parámetros del lado izquierdo de la ecuación. En cierto sentido, la recursión es el equivalente computacional de la inducción para las demostraciones.

Más sobre la función factorial Dado que las ecuaciones se evalúan en secuencia, también podemos definir: factorial :: Int -> Int factorial 0 = 1 factorial n = n * factorial (n -1)

Más sobre la función factorial Dado que las ecuaciones se evalúan en secuencia, también podemos definir: factorial :: Int -> Int factorial 0 = 1 factorial n = n * factorial (n -1) Observar que factorial 70 = 0 Por qué sucede esto?

Más sobre la función factorial Dado que las ecuaciones se evalúan en secuencia, también podemos definir: factorial :: Int -> Int factorial 0 = 1 factorial n = n * factorial (n -1) Observar que factorial 70 = 0 Por qué sucede esto? factorial :: Integer -> Integer factorial 0 = 1 factorial n = n * factorial (n -1)

Otro ejemplo clásico Consideremos la sucesión de Fibonacci: F 0 = 0 F 1 = 1 F n = F n 1 + F n 2 n 2 Programar en Haskell una función que dado n calcule F n fib :: Integer -> Integer Mostrar cómo reduce la siguiente expresión fib (1+2)?? (utilizando evaluación Lazy)

Asegurarse de llegar a un caso base Consideremos este programa recursivo para determinar si un número es par: par :: Int -> Bool par 0 = True par n = par (n-2) Qué problema tiene esta función?

Asegurarse de llegar a un caso base Consideremos este programa recursivo para determinar si un número es par: par :: Int -> Bool par 0 = True par n = par (n-2) Qué problema tiene esta función? Cómo se arregla?

Asegurarse de llegar a un caso base Consideremos este programa recursivo para determinar si un número es par: par :: Int -> Bool par 0 = True par n = par (n-2) Qué problema tiene esta función? Cómo se arregla? par 0 = True par 1 = False par n = par (n-2) par 0 = True par n = not (par (n-1))

Recursión sobre listas No todo son números Podremos implementar la función que suma todos los elementos de una lista?

Recursión sobre listas No todo son números Podremos implementar la función que suma todos los elementos de una lista? suma :: [Integer] -> Integer suma lista length lista == 0 = 0 suma lista otherwise = head lista + suma (tail lista) Implementemos las siguientes funciones Implementar y dar el tipo de la productoria de una lista. Implementar la función reverso :: [a] -> [a] Mostrar los pasos de reducción para la evaluación de reverso [ a, b, c ] Implementar la función capicua :: [Integer] -> Bool que devuelve verdadero si el reverso de una lista de números es la misma lista.

Ejercicios 1 Escribir una función que dados dos n, m N devuelva el combinatorio ( n m). Hacerlo usando la igualdad ( ) ( n m = n 1 ) ( m + n 1 m 1). 2 Escribir una función que dado n N sume los primeros n números impares. Ej: sumaimpares 3 1 + 3 + 5 9. 3 Escribir una función que dado n N sume los cuadrados de los primeros n números impares. Ej: sumacuadradosimpares 3 1ˆ2 + 3ˆ2 + 5ˆ2 1 + 9 + 25 35. 4 (*) Escribir una función que dado n N sume los impares tales que su cuadrado sea menor que n. Ej: sumaimparescuadradosmenoresa 30 1 + 3 + 5 9. 5 Escribir una función para determinar recursivamente si un número es múltiplo de 3. No se puede usar las funciones mod y div para resolver este ejercicio. 6 Escribir una función recursiva que no termine si se ejecuta con números negativos. 7 Escribir una función para calcular n!! = n (n 2)(n 4)... 2. La función se debe indefinir para los números impares. 8 Implementar la función todosverdaderos :: [Bool] -> Bool que devuelve verdadero sólo si todos los elementos de la listas son verdaderos. Ejemplo todosverdaderos [True, 2 < 3, 4 + 2 > 5] True. 9 Implementar la función tomarn :: Int -> [a] -> [a] que retorna la lista de los primeros n elementos de la lista de entrada (para entender el funcionamiento revisar su equivalente en haskell: take).