Herramientas de usuario

Herramientas del sitio


introalg:taller3

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
introalg:taller3 [2006/05/16 12:27] nicolaswintroalg:taller3 [2018/08/10 03:03] (actual) – editor externo 127.0.0.1
Línea 2: Línea 2:
  
 ===== Plan para hoy ===== ===== Plan para hoy =====
 +  * Revisar algunas soluciones de la Wiki.
 +  * Funciones que toman funciones.
 +  * Casos mas complejos de recursiones con listas.
 +  * Resolución de ejercicios.
 +  * Anuncios varios.
  
 ===== Algunas soluciones de la clase anterior ====== ===== Algunas soluciones de la clase anterior ======
  
 Veamos algunas soluciones presentadas [[introalg:rincon | Wiki de Scripts Haskell]]. Veamos algunas soluciones presentadas [[introalg:rincon | Wiki de Scripts Haskell]].
 +
 +
 +  * Función ''cabeza'', duplicación de casos.
 +  * ¿Lista capicúa recursiva?
 +    * Calificadores de **clase** (''Eq a =>'')
 +    * Pattern matching es más general de lo que vimos.
 +  * La lista binaria ''listbin'' muy complicada
 +    * Todos los programas se puede hacer en un par de lineas y si no usamos definiciones locales y/o otras funciones que //dividan el problema en partes// ([[http://en.wikipedia.org/wiki/Divide_and_conquer_algorithm | dividir y conquistar]]).
 +  
  
 ===== Clase ===== ===== Clase =====
Línea 11: Línea 25:
 Veamos el ejercicio 18 Veamos el ejercicio 18
  
 +-----
 Defina la función //paraTodo: (A-> Bool)-> [A]-> Bool//, donde //paraTodo.p.xs// decide si todos los elementos de la lista //xs// cumplen con el **predicado** //p//. Defina la función //paraTodo: (A-> Bool)-> [A]-> Bool//, donde //paraTodo.p.xs// decide si todos los elementos de la lista //xs// cumplen con el **predicado** //p//.
 +-----
  
 Nuevamente esta función es el típico caso que se resuelve con un caso base y un caso inductivo Nuevamente esta función es el típico caso que se resuelve con un caso base y un caso inductivo
Línea 70: Línea 86:
   [("Saturnino",9),("Tamburrini",8),("Berlin",3)]   [("Saturnino",9),("Tamburrini",8),("Berlin",3)]
    
-Esta función requiere inducción en dos listas al mismo tiempo, por lo tanto tenemos el //pattern matching// tendrá ahora 4 casos.+Esta función requiere inducción en dos listas al mismo tiempo, por lo tanto tenemos el //pattern matching// tendrá ahora **4 casos**.
  
   * Caso(s) base(s)   * Caso(s) base(s)
Línea 89: Línea 105:
  
 ¿Cuál es el problema? \\ ¿Cuál es el problema? \\
-Tenemos un problema de tipos, el tipo de la función //no es lo suficientemente general//.+Tenemos un problema de tipos, el tipo de la función //no es lo suficientemente general//. \\ 
 +Lo corregimos para que sea ''cierra :: [a] -> [b] -> [(a,b)]''
 + 
 +Usando las ideas de este ejemplo podemos resolver los ejercicios 21 y 22 del práctico 8. 
 + 
 +\\ 
 + 
 +Generalicemos las funciones ''duplicar'' y ''multiplicar'' que vimos anteriormente. 
 + 
 +  duplicar :: [Int] -> [Int] 
 +  duplicar [] = [] 
 +  duplicar (x:xs) = x*2 : duplicar xs 
 + 
 +  multiplicar :: [Int] -> Int -> [Int] 
 +  multiplicar [] a = [] 
 +  multiplicar (x:xs) a = x*a : multiplicar xs a 
 + 
 +La estructura es la misma, estamos aplicando una función a cada elemento de la lista.\\ 
 +El ejercicio 24 dice: 
 + 
 +----- 
 +a) Defina la función //mapear:(A -> B) -> [A] -> [B]// que dadas una función //f// y una lista //xs//, aplica //f// a cada elemento de la lista.\\ 
 +Ejemplo: //mapear.primo.[1,2,3,4,5,6]=[false,true,true,false,true,false]//
 +----- 
 + 
 +Tenemos nuevamente una **función de alto orden** y su definición es bien sencilla, con los dos casos (vacía y al menos un elemento) alcanza. 
 + 
 +  mapear :: (a->b) -> [a] -> [b] 
 +  mapear f [] = [] 
 +  mapear f (x:xs) = f x : mapear f xs 
 + 
 +Ahora ''duplicar'' es un caso particular si usamos //la sección del operador ''*''//
 + 
 +  Main> mapear (*2) [1,2,3] 
 +  [2,4,6] 
 + 
 +Podemos definir ''duplica' '' sin tener que hablar de la lista! 
 + 
 +  duplica' = mapear (*2) 
 + 
 +Vemos como funciona haciendo los pasos de reducción de ''duplica' [1,2]''. \\ 
 + 
 +  * Gracias a la //currificación// tenemos funciones que no necesitan nombrar todos sus argumentos. 
 +  * Notación muy compacta y legible.
  
 ===== Ejercicios ===== ===== Ejercicios =====
-  * (P8,E19) Usando ''paraTodo'', ''desdeHasta'' y ''noMultiplo'', defina la función ''primo''. +  * (P8,E19) Usando ''paraTodo'', ''desdeHasta'' y ''noMultiplo'', defina la función ''primo''. Pruebe con los siguientes primos: 7, 73, 739, 7393, 73939, 739391, 7393913, [[http://en.wikipedia.org/wiki/Prime_number#Trivia|73939133]], donde sus sucesores no lo son.
-Pruebe con los siguientes primos: 7, 73, 739, 7393, 73939, 739391, 7393913, [[http://en.wikipedia.org/wiki/Prime_number#Trivia|73939133]], donde sus sucesores no lo son.+
   * (P8,E21) Defina la función ''iguales :: Eq a => [a] -> [a] -> Bool'' que retorna //true// si las listas son iguales.   * (P8,E21) Defina la función ''iguales :: Eq a => [a] -> [a] -> Bool'' que retorna //true// si las listas son iguales.
-  * (P8,E24) Definla la función ''mapear :: (a->b) -> [a] -> [b]'', que dada una función ''f'' y una lista ''xs'' aplica ''f'' a cada elemento de la listaEscriba ''duplicar' ''''multiplicar' '' utilizando ''mapear''.+  * (P8,E24) Defina la función ''multiplicar' '' usando ''mapear''. Intente escribirla sin usar el argumento que nombra la lista. 
 +  * (P8,E24) Defina la la función ''filtrar :: (a->Bool) -> [a] -> [a]'', que dado un predicado ''p'' y una lista ''xs'' , devuelve todos los elementos que satisfacen ''p''Ejemplo ''filtro primo (desdeHasta 1 100)'' devuelve todos los primos entre 1 100 (casi el ejercicio 20). 
 + 
 +===== Anuncios ===== 
 + 
 +  * La proxima clase (martes 23 de Mayo) habrá practica supervisada de taller. 
 +  * Vamos a evaluar el taller, como un parcialito más.
introalg/taller3.1147782463.txt.gz · Última modificación: 2018/08/10 03:03 (editor externo)