Download Instituto Tecnológico de Tepic Programación Lógica y Funcional
Transcript
Instituto Tecnológico de Tepic Programación Lógica y Funcional Alumno: Nicolás Mendoza López Trabajo: EJERCICIOS DE PROGRAMACION EN HASKELL PROGRAMACION FUNCIONAL Y EVALUACION PEREZOSA Contenido INTRODUCCION................................................................................................... 3 1. Cuadrado de un numero...........................................................................4 2. Elevar un número a la cuarta potencia.................................................4 3. Sumar todos los elementos de una lista...............................................5 4. Ultima cifra de un número.......................................................................5 5. Número mayor de 3 números..................................................................5 6. Rota un elemento de la lista...................................................................6 7. Rota n elementos de la lista.........................................................................6 8. Obtener lista quitando extremos..................................................................7 9. Ordenar lista de menor a mayor...................................................................7 10. Obtener verdadero o falso.........................................................................8 11. Sacar el cuadrado de los números pares de una lista y ordenarlos...........8 12. Imprimir misma lista utilizando conjuntos.................................................9 13. generar lista a partir de tope.....................................................................9 14. Obtener números primos hasta tope.........................................................9 15. Obtener una lista de los múltiplos de un numero....................................10 16. Obtener lista de números pares gasta tope.............................................10 17. Obtener lista de números impares hasta tope.........................................11 18. Obtener tuplas a partir de tope de dos conjuntos de valores..................11 19. Obtener la posición de una letra con tuplas............................................12 20. Recorrido de un árbol en orden...............................................................12 CONCLUSION..................................................................................................... 13 INTRODUCCION El presente documento trata sobre las diferentes funciones de haskell que se usaron durante el transcurso de la unidad 2. Dichas funciones ayudaron o realizaron diferentes actividades, como ordenar alguna lista, obtener números primos, eliminar algunos elementos de una lista entre otras acciones. DESARROLLO 1. Cuadrado de un numero Solución en haskell cuadrado x = x*x Comprobación de funcionamiento Prueba de escritorio (Evaluación Perezosa) Cuadrado 3 = 3*3 =9 2. Elevar un número a la cuarta potencia. Solución en Haskell cuadrado x = x*x cuadruple x = cuadrado (cuadrado x) Comprobación de funcionamiento Evaluación perezosa Cuádruple 3 = cuadrado(cuadrado 3) =cuadrado(3*3) =cuadrado(9) =9*9 =81 3. Sumar todos los elementos de una lista. Solución en Haskell sumaLista [] = 0 sumaLista (x:xs) = x + sumaLista xs Comprobación de funcionamiento Evaluación perezosa =1+ sumaLista[2,3,4] =1+2+sumaLista[3,4] =1+2+3+sumaLista[4] =1+2+3+4+sumaLista[ ] =10 4. Ultima cifra de un número. Solución en Haskell ultimaCifra x= rem x 10 Comprobación de funcionamiento Evaluación perezosa ultimaCifra 328= rem 328 x10 =8 5. Número mayor de 3 números. Solución en Haskell maxTres a b c = max a (max b c) Comprobación de funcionamiento Evaluación perezosa maxTres 2 5 3 = max 2(max 5 3) =max 5 3 =5 6. Rota un elemento de la lista. Solución en Haskell rotaElemento xs = tail xs ++ [head xs] Comprobación de funcionamiento Evaluación perezosa rotaElemento[1,2,3]=[2,3]++[1] =[2,3,1] 7. Rota n elementos de la lista Solución en Haskell rota n xs = drop n xs ++ take n xs Comprobación de funcionamiento Evaluación perezosa Rota 3 [1,2,3,4]=drop 3 [1+2+3]++ take 3 [1,2,3,4] =[4]++[1,2,3] =[4,1,2,3] 8. Obtener lista quitando extremos Solución en Haskell centros1 xs = init (tail xs) Comprobación de funcionamiento Evaluación perezosa Centros1 [1,2,3,4]= init (tails [1,2,3,4]) =init [2,3,4] =[2,3] 9. Ordenar lista de menor a mayor. Solución en Haskell ordena [] = [] ordena (x:xs) = (ordena menores) ++ [x] ++ (ordena mayores) where menores = [a|a<-xs, a<=x] mayores = [b|b<-xs, b>x] Comprobación de funcionamiento Evaluación perezosa Ordena [77,3,2]= ordena menores ++ [77]++ordena mayores =ordena [3,2]++[9]++ordena[] =ordena menores ++ [3]++ordena ++[77]++[] =ordena[2]++[3]++ordena[]++[77]++[] =ordena menores ++[2]++ordena mayores++ [3]++[]++[77]++ [] =ordena[]++[2]++ordena[]++[3]++[]++[77]++[] =[]++[2]++[]++[3]++[]++[77]++[] =[2,3,77] 10. Obtener verdadero o falso Solución en Haskell parimpar x = even x Comprobación de funcionamiento Evaluación perezosa 11. Sacar el cuadrado de los números pares de una lista y ordenarlos. Solución en Haskell cuadrado2 [] = [] cuadrado2 (x:xs) = ordena( if even x then [x*x]++ cuadrado2 xs else [x]++ cuadrado2 xs ) Comprobación de funcionamiento Evaluación perezosa Imprimir misma lista utilizando conjuntos Solución en Haskell 12. imprimir xs = [x | x <-xs] Comprobación de funcionamiento Evaluación perezosa imprimir [1,2,3] = [1,2,3] generar lista a partir de tope Solución en Haskell 13. generarLis tope = [x | x <- [1..tope]] Comprobación de funcionamiento Evaluación perezosa generrLis 7=[1,2,3,4,5,6,7] 14. Obtener números primos hasta tope Solución en Haskell generar = criba [2..] where criba [] = [] criba (n:ns) = n: criba (elimina n ns) elimina n xs = [x | x <- xs, x `mod` n /=0] primo x = x == head (dropWhile (<x) generar) primos tope=[x|x<-[1..tope],primo x] Comprobación de funcionamiento Evaluación perezosa Primos 6 = [2,3,5] 15. Obtener una lista de los múltiplos de un numero Solución en Haskell multiplos tope = [x | x <-[1..tope], tope `mod` x == 0] Comprobación de funcionamiento 16. Evaluación perezosa Múltiplos= [1,2,3,5,10] Obtener lista de números pares gasta tope Solución en Haskell pares tope = [x | x <-[1..tope], even x] Comprobación de funcionamiento Evaluación perezosa Pares 10=[2,4,6,8,10] 17. Obtener lista de números impares hasta tope Solución en Haskell impares tope = [x | x <-[1..tope], odd x] Comprobación de funcionamiento Evaluación perezosa Impares 10,[1,3,5,7,9] 18. Obtener tuplas a partir de tope de dos conjuntos de valores Solución en Haskell tupla x = [(w,z) | (w,z) <- zip ['a'..'z'][1..x]] Comprobación de funcionamiento Evaluación perezosa Obtener la posición de una letra con tuplas. Solución en Haskell 19. posicionLetra x = [z | (w,z) <- zip ['a'..'z'][1..], w == x] Comprobación de funcionamiento Evaluación perezosa Recorrido de un árbol en orden. Solución en Haskell enorden(x id) =enorden i++[x]++ enordend 20. Comprobación de funcionamiento Evaluación perezosa =enorden 2++[3]++enorden4++[9]++enordenH++[10]+ +enordenH =enordenH++[2]++enordenH++[3]++enordenH hoja++[4]+ +enordenH++[9]++[ ]++[10]++[ ] =[ ]++[2]++[ ]++[3]++[ ]++[4]++[ ]++[9]++[ ]++[10]++[ ] =[2,3,4,9,10] CONCLUSION Es un poco confuso el manejo de las funciones en haskell, sin embargo lo que sorprende es como se puede obtener un mismo resultado de diferentes maneras, ya sea usando una única función o implementando algunas otras acciones pero que al final se obtienen el mismo resultado que se busca.