Herramientas de usuario

Herramientas del sitio


introalg:taller2

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:taller2 [2006/05/08 19:34] nicolaswintroalg:taller2 [2018/08/10 03:03] (actual) – editor externo 127.0.0.1
Línea 2: Línea 2:
  
 ===== Plan para hoy ===== ===== Plan para hoy =====
-  * Repaso de algunas soluciones de la clase anterior +  * Repaso de algunas soluciones de la clase anterior. 
-  * Trabajar sobre programas recursivos numéricos y con listas +  * Sintáxis de //pattern matching//
-  * Sintáxis de //pattern matching// +  * Trabajar sobre programas recursivos numéricos y con listas. 
-  * Resolución de ejercicios+  * Resolución de ejercicios.
  
 ===== Algunas soluciones de la clase anterior ====== ===== Algunas soluciones de la clase anterior ======
  
-A partir de la [[introalg:rincon | Wiki de Scripts Haskell]] veamos algunas soluciones presentadas+Veamos algunas soluciones presentadas [[introalg:rincon | Wiki de Scripts Haskell]].
  
-  edad :: (Int, Int, Int) -> (Int, Int, Int) -> Int +Notamos 
-  edad (d, m, a) (d', m', a') | 12 < m || 12 < m' || m < 0 || m' < 0 = error "El mes no es valido." +  * No hay una única forma de resolver un problema
-   | ([31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] !!(m - 1)) < d = error "El dia del mes inicial no es valido." +  * Como hacer **control de los parámetros de entrada**
-   | ([31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] !!(m- 1)) < d= error "El dia del mes final no es valido." +  * Cláusula **''otherwise''** para análisis por casos
-   | a < 0 || a' < a = error "El año inicial es menor que cero o menor que el año final." +  * **Comentarios** en el código
-   | a == a&& m< m = error "Mismo año pero el mes inicial es mayor que el final." +  * Uso del **''if-then-else''** en vez de análisis por casos
-  | a == a&& m== m && d' < d = error "Mismo mes y año pero dia inicial mayor que el final." +  * ¿**Guardas //exhaustivas//**?. Uso del cálculo proposicional
-   | (m' < m) || (m' == m && d' < d) = (a'-a)-1  -- No alcanza a completar un año+  * No se usaron **definiciones locales** para la función de cálculo de área. 
-   | otherwise = a'-a  -- Ningun caso especial, resta directa.+ 
 +** Se aprende muchísimo //leyendo detenidamente código bien escrito// **
  
 ===== Clase ===== ===== Clase =====
  
 +Hasta ahora vimos programas funcionales **no recursivos**, que se basan en la //composición de funciones// de la bibilioteca (''Prelude'') y las definidas en scripts de Haskell.
 +
 +Veamos la última función no recursiva que vamos a plantear, que sirve para presentar el mecanismo de **pattern matching**.
 +
 +  Ejercicio 8
 +  Definir la función cabeza:[A]->A que devuelve el primer elemento de la lista.
 +
 +Por ejemplo ''cabeza [4,3,2]'' reduce a la //forma canónica// '4'.
 +
 +El mecanismo básico para poder **destruir** una lista en partes es el //pattern matching//, que podemos pensarlo como una definición por casos, que es capaz de dividir la lista en su **cabeza** y **cola**
 +
 +  cabeza :: [a] -> a
 +  cabeza (x:xs) = x
 +
 +Podemos agregar esta definición a un script de Haskell con nombre ''practico8.hs''.\\ 
 +Evaluemos algunos casos.
 +
 +  Main> cabeza [1,2,3]
 +  1
 +  Main> cabeza "minombre"
 +  'm'
 +  Main> cabeza []
 +  
 +  Program error: pattern match failure: cabeza []
 +
 +De la misma forma podemos hacer la función ''cola'' solo que devolviendo ''xs'' en lugar de x.
 +
 +  cola :: [a] -> [a]
 +  cola (x:xs) = xs
 +
 +También tenemos //pattern matching// numérico. \\
 +Vemos como escribir una funcion que devuelve verdadero si y solo si el número es 0 o 1 (puede ser útil para el ejercicio 17)
 +
 +  ceroOuno :: Int -> Bool
 +  ceroOuno 0 = True
 +  ceroOuno 1 = True
 +  ceroOuno x = False
 +
 +
 +==== Programas Recursivos ====
 +
 +Tomemos el ejercicio 10 del Práctico 8.
 +
 +  Defina la función duplicar::[Num]->[Num] que dada una lista duplica cada uno de sus elementos.
 +  Ejemplo: duplicar [2,4,8] = [4,8,16]
 +
 +Usamos un planteamiento //inductivo o recursivo// y //pattern matching// para
 +  * Definir un **caso base** (lista vacía ''[]'')
 +  * Definir el **caso inductivo** (la lista tiene al menos un elemento, siendo el primero ''x'' y el resto de la lista ''xs'')
 +
 +  duplicar :: [Int] -> [Int]
 +  duplicar [] = []               -- caso base
 +  duplicar (x:xs) = 2*x : xs     -- caso inductivo
 +
 +Probamos la definición
 +
 +  Main> duplicar [2,3,4]
 +  [4,3,4]
 +
 +¿Donde está el error?
 +
 +Simplemente olvidamos duplicar la "cola" de la lista. \\
 +Lo arreglamos rápidamente, aplicando **la misma definición de duplicar a la lista restante**.
 +
 +Veamos ahora el ejercicio 12.
 +
 +  Defina la función sumatoria:[Num]->Num que dada una lista devuelve la suma de sus elementos.
 +
 +La estrategia es la misma que en el caso anterior
 +  * Definir caso base para la lista vacía.
 +  * Definir el caso inductivo para la lista con al menos un elemento, suponiendo que ya esta definido para longitudes menores.
 +
 +  sumatoria :: [Int] -> Int
 +  sumatoria [] = 0
 +  sumatoria (x:xs) = x + sumatoria xs
 +
 +Vemos algunos ejemplos
 +
 +  Main> sumatoria [1,2,3]
 +  6
 +  Main> sumatoria (duplicar (duplicar [1,2,3]))
 +  24
 +  Main> sumatoria ((duplicar.duplicar) [1,2,3])
 +  24
 +
 +Veamos el siguiente código y tratemos de entender que es lo que //computa//
 +
 +  desdeHasta :: Int -> Int -> [Int]
 +  desdeHasta n m  | n> = []
 +                  | n==m = [n]
 +                  | n< = n : desdeHasta (n+1) m
 +
 +  * ¿A qué evaluaría ''desdeHasta 10 10''?
 +  * ¿Y ''desdeHasta 4 1''?
 +  * Finalmente que pasa exactamente con ''desdeHasta 41 43''.
 +
 +Notamos que son importantes
 +  * Los nombres de la función y de las variables, pues ayudan a entender su funcionalidad.
 +  * La //signatura// o declaración de los tipos.
 +  * Una buena //diagramación// de los casos.
  
  
 ===== Ejercicios ===== ===== Ejercicios =====
  
 +Realizar en lo que resta de la clase
  
 +  * (P8-E11) Definir la función //multiplicar:[Num]-> Num -> [Num]// que dada una lista y un número //r// multiplica cada uno de los elementos por //r//. Ejemplo //multiplicar.[2,4,8].3 = [6,12,24]//. Notar que generaliza //duplicar//.
 +  * (P8-E12) Defina la función promedio //promedio:[Num] -> Num// que dada una lista de números, calcule su promedio.
 +  * (P8-E16) (*) c) Modificar la guarda de ''n>m'' en ''desdeHasta'' para que si esto pasa retorne la lista descendente.
introalg/taller2.1147116860.txt.gz · Última modificación: 2018/08/10 03:03 (editor externo)