gabrielbonham

Haskell - Exercicios

Sep 22nd, 2013
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import Data.Char
  2. import Data.List
  3.  
  4. -- Ex 1
  5.  
  6. -- Escreva uma função recursiva que verifica se um dado elemento pertence à uma lista.
  7. -- A função deve ter como argumentos uma lista e o elemento a ser procurado, e deve
  8. --produzir como resultado um valor booleano (True/False) como no exemplo abaixo:
  9. --      > pertence ’a’ [’b’,’c’,’a’,’d’]
  10. --      True
  11.  
  12. pertence :: Eq l => l -> [l] -> Bool
  13. pertence x [] = False
  14. pertence x (h:t) = if (x == h) then True
  15.                     else pertence x t
  16.        
  17. -- Ex 2
  18.        
  19. --Escreva uma função para calcular a média dos elementos de uma lista de números.
  20. --Deve-se implementar duas funções recursivas, uma para obter a quantidade de ele-
  21. --mentos e outra para obter a soma dos elementos.Finalmente, a média é calculada pela
  22. --divisão entre a soma e a quantidade.
  23. --      > media [4,5,2,7]
  24. --      4.5
  25.  
  26. qtd :: [Float] -> Float
  27. qtd [] = 0
  28. qtd (h:t) = 1 + qtd t
  29.  
  30. soma :: [Float] -> Float
  31. soma [] = 0
  32. soma (h:t) = h + soma t
  33.  
  34. media :: [Float] -> Float
  35. media l = (soma l) / (qtd l)
  36.  
  37. --  Ex 3
  38. --  Seja a função abaixo:
  39. --  maior [a] = a
  40. --  maior (a:as) = if (a > (maior as)) then a else (maior as)
  41. -- (a) Defina o tipo mais genérico para essa função;
  42. -- (b) Reescreva essa função eliminando o comando if;
  43. -- (c) Com base nessa função, crie uma nova função que devolva o menor elemento de
  44. -- uma lista. Não se esqueça de definir o tipo;
  45. -- (d) Usando as funções maior e menor, crie uma nova função que, a partir de uma
  46. -- lista, devolve o maior e o menor elemento em uma tupla. Não se esqueça de
  47. -- definir corretamente o tipo dessa função.
  48.  
  49. maior [h] = h
  50. maior (h:t) = max h (maior t)
  51.                
  52. menor [h] = h
  53. menor (h:t) = min h (menor t)
  54.  
  55. maiorMenor :: [Integer] -> (Integer,Integer)
  56. maiorMenor l = (maior l,menor l)
  57.  
  58. -- Ex 4
  59. -- No módulo Char encontramos a função toUpper que converte uma letra minúscula na
  60. -- sua correspondente maiúscula1.
  61. --  (a) Crie uma função recursiva maius que converte todas as letras de uma palavra em
  62. -- maiúsculas;
  63. --  (b) Usando a função isAlpha, também do módulo Char, refaça a função maius para
  64. --descartar símbolos e números;
  65. --  (c) Faça uma nova função que recebe uma palavra e devolve em tupla a palavra
  66. -- original e a sua correspondente escrita em maiúscula.
  67.  
  68. -- a
  69. maius :: [Char] -> [Char]
  70. maius [] = []
  71. maius (h:t) = (toUpper h) : maius t
  72.  
  73. -- b
  74. maius2 :: [Char] -> [Char]
  75. maius2 [] = []
  76. maius2 (h:t) = if isAlpha h then (toUpper h) : maius2 t
  77.                 else maius2 t
  78. -- c
  79. letterC :: [Char] -> ([Char],[Char])
  80. letterC l = (l,maius l)
  81.  
  82. -- Ex. 5
  83. -- Implemente, usando recursão, as seguintes operações sobre conjuntos (listas):
  84. --(a) pertence: define se um dado elemento pertence a um conjunto;
  85. --(b) uniao: dados dois conjuntos, fornece a união deles;
  86. --(c) inter: dados dois conjuntos, fornece a intersecção deles;
  87. --(d) diff: dados dois conjuntos, fornece a diferença deles;
  88. --(e) subCon: dados dois conjuntos, diz se o primeiro é subconjunto do segundo
  89.  
  90. -- a
  91.  
  92. -- b
  93. concatena :: Eq t => [t] -> [t] -> [t]
  94. concatena [] l2 = l2
  95. concatena (x:xs) l2 = x : (concatena xs l2)
  96.  
  97. uniaoAux :: Ord t => [t] -> [t] -> [t] -> [t]
  98. uniaoAux [] l2 l3 = (l2 ++ l3)
  99. uniaoAux (x:xs) l2 l3 = if not(pertence x l2) then uniaoAux xs l2 (x : l3)
  100.                         else uniaoAux xs l2 l3
  101.  
  102. uniao :: Ord t => [t] -> [t] -> [t]
  103. uniao l1 l2 = sort (uniaoAux l1 l2 [])
  104.                    
  105. -- c
  106. interAux :: Ord t => [t] -> [t] -> [t] -> [t]
  107. interAux [] l2 l3 = l3
  108. interAux (x:xs) l2 l3 = if (pertence x l2) then interAux xs l2 (x : l3)
  109.                     else interAux xs l2 l3
  110.  
  111. inter :: Ord t => [t] -> [t] -> [t]
  112. inter l1 l2 = sort(interAux l1 l2 [])
  113.  
  114. -- d
  115. diffAux :: Ord t => [t] -> [t] -> [t] -> [t]
  116. diffAux [] l2 l3 = (sort l3)
  117. diffAux (x:xs) l2 l3 = if not(pertence x l2) then diffAux xs l2 (x:l3)
  118.                         else diffAux xs l2 l3
  119.  
  120. diff :: Ord t => [t] -> [t] -> [t]
  121. diff l1 l2 = sort((diffAux l1 l2 []) ++ (diffAux l2 l1 []))
  122.  
  123. -- e
  124. subCon :: Ord t => [t] -> [t] -> Bool
  125. subCon [] l2 = True
  126. subCon (x:xs) l2 = if (pertence x l2) then subCon xs l2
  127.                     else False
Advertisement
Add Comment
Please, Sign In to add comment