Você está na página 1de 2

agrupa [ [ 1 . . 6 ] , [ 7 . . 9 ] , [ 1 0 . .

2 0 ] ] == [ [ 1 , 7 , 1 0 ] , [ 2 , 8 , 1 1 ] , [ 3 , 9 , 1 2 ] ]
agrupa [ ] == [ ]
o mystery faz?
9. O que a funca

o Funcional
Programaca
Folha de Exerccios 04

mystery xs = f o l d r (++) [ ] (map s i n g xs )


sing x = [x]
o da funca
o concatenaFold :: [[a]] -> [a] que concatena
10. Escreva a definica
o foldr::(a -> b -> b) -> b -> [a] -> b
uma lista de listas usando a funca
o recursiva:
Dica: Considere a seguinte definica

Prof. Wladimir Ara


ujo Tavares

co nc at ena : : [ [ a ] ] > [ a ]
co nc ate na [ ] = [ ]
co nc ate na ( x : xs ) = x ++ c onc at en a xs
o da funca
o inverteFold :: [a] -> [a] que inverte uma lista
11. Escreva a definica
o foldr:(a -> b -> b) -> b -> [a] -> b
usando a funca

o divideMedia :: [Double] -> ([Double],[Double]) tal que


1. Escreva a funca
(divideMedia xs) devolve o par (ys, zs), onde ys e formado pelos elementos de
xs estritamente menores que a media, enquanto zs e formado pelos elementos de
xs estritamente maiores que a media. Por exemplo,

o recursiva:
Dica: Considere a seguinte definica
i n v e r t e : : [ a ] > [ a ]
inverte [] = []
i n v e r t e xs = ( l a s t xs ) : i n v e r t e ( i n i t xs )

divideMedia [6,7,2,8,6,3,4] == ([2.0,3.0,4.0],[6.0,7.0,8.0,6.0])


o media e use a funca
o filter :: (a->Bool) -> [a] ->
Dica: defina a funca
[a].
o do prel
2. A funca
udio scanl e uma variante do foldl que produz a lista com os valores
acumulados:
scanl f z [x1, x2, ...]

o da funca
o tamanhoFold :: [a] -> Int que retorna o
12. Escreva a definica
o foldr:(a -> b -> b) -> b -> [a] ->
tamanho de uma lista usando a funca
b.

= [z, f z x1, f (f z x1) x2, ...]

o recursiva:
Dica: Considere a seguinte definica

Por exemplo:

tamanho : : [ a ] > I n t
tamanho [ ]
= 0
tamanho ( x : xs ) = 1 + length xs

scanl (+) 0 [1, 2, 3] = [0, 0 + 1, 0 + 1 + 2, 0 + 1 + 2 + 3] = [0,


1, 3, 6]

o da funca
o elementoFold a :: [a] -> Bool que determina
13. Escreva a definica
o foldr:(a -> b ->
se um elemento pertence ou n
ao a uma lista usando a funca
b) -> b -> [a] -> b.

o scanl para definir a funca


o fatAcc n que retorna uma lista de
(a) Use a funca
com [1!, 2!, . . . , n!]
fatAcc 10 == [1,2,6,24,120,720,5040,40320,362880,3628800]

o recursiva:
Dica: Considere a seguinte definica

o fatAcc para definir a funca


o fatorial.
(b) Use a funca

elemento : : Eq a => a > [ a ] > Bool


elemento y [ ]
= False
elemento y ( x : xs ) = ( x == y ) | | elemento y xs

o partir :: Int -> [a] -> [[a]] tal que partir n de


3. Escreva uma funca
o d
decomp
oe uma lista em sub-listas cuja concatenaca
a a lista original e tal que
ltima).
cada sub-lista tem comprimento n (exceto, possivelmente, a u

o paridade :: [Bool] -> Bool que calcule a paridade de


14. Escreva uma funca
uma sequencia de bits (representados como uma lista de boleanos): se o n
umero
de bits de valor True for mpar ent
ao a paridade e True, caso contr
ario e False.

Exemplo:partir 5 "abdefghijkl"= ["abde", "fghij", "kl"]


o take , drop e (:)
Dica: use a funca
4. A soma da serie

Exemplo: paridade [True,True, False,True] = True

1
1
1
1

= 2 + 2 + 2 + 2 + ...
6
1
2
3
4

o recursiva para a funca


o paridade.
(a) Escreva uma definica

(1)

o usando o foldr para a funca


o paridadeFold.
(b) Escreva uma definica

Portanto, o valor de pode ser aproximado mediante a raiz quadrada de 6 vezes a


o aproximaPi tal que (aproximaPi) e a aproximaca
o
soma da serie. Defina a funca
obtida pela soma dos n primeiros termos da serie. Por exemplo,

o duplicar :: String -> String repete duas vezes cada vogal (letras
15. A funca
a, e, i, o, u min
usculas ou mai
usculas) numa cadeia de carateres; os outros
carateres devem ficar inalterados.

aproximaPi 4 == 2.9226129861250305
aproximaPi 1000 == 3.1406380562059946

Exemplo: duplicar "Ola, mundo!"== "OOlaa, muundoo!"


Dica: Crie uma lista com as vogais min
usculas e mai
usculas.

o group em Haskell que recebe como argumento uma lista l de


5. Defina uma funca
valores e agrupa os valores repetidos, retornando uma lista de pares nos quais
es
o primeiro componente e um valor de l e o segundo e o n
umero de repetico
consecutivas desse valor.

o recursiva para a funca


o duplicar.
(a) Escreva uma definica
o usando o foldr para a funca
o duplicarFold que faz o
(b) Escreva uma definica
mesmo que duplicar.

Por exemplo:

o filtraAplica :: (a->b) -> (a->Bool)->[a]->[b] tal que


16. Defina a funca
o f aos elementos de
(filtraAplica f p xs) e uma lista obtida aplicando a funca
xs que satisfazem o predicado p. Por exemplo,

group [1,1,2,2,2,3,4,5,5,1] == [(1,2),(2,3),(3,1),(4,1),(5,2),(1,1)]


o takeWhile, encontre uma sub-cadeia inicial que contem
(a) Usando a funca
todos os n
umeros iguais.

filtraAplica (4+) (<3) [1..7] => [5,6]


o:
Defina a funca

o dropWhile, remova uma subcadeia inicial que contem todos


(b) Usando a funca
os n
umeros iguais.

(a) Usando compreens


ao de listas.

o recursiva para a funca


o group.
(c) Escreva uma definica

o map e filter.
(b) Usando a funca

o de funca
o em Haskell:
6. Considere a seguinte definica

(c) Usando recurs


ao
o foldr
(d) Usando a funca

until p f x = if p x then x else until p f (f x)

17. Considere um polin


omio P (X) = c0 + c1 z + . . . + cn z n representado pela lista
dos seus coeficientes [c0, c1, . . . ; cn ]. Podemos calcular o valor do polin
omio num
ponto de forma eficiente usando a forma de Horner :

o until?
(a) Qual e o tipo da funca
o da express
(b) Qual e o resultado da avaliaca
ao until (< 10) square 2?
o until para definir uma funca
o que, dado um string s, retorne o
(c) Use a funca
string obtido removendo-se todos os caracteres iguais a branco que ocorrem
no incio de s.

P (z) = c0+c1 z +. . .+cn zn = c0 +z (c1 +z (. . .+z (cn1 +z cn ) . . .))


(2)
Note que usando a express
ao n
ao necessitamos de calcular potencias: para calcular
es e n produtos.
o valor dum polin
omio de grau n usamos apenas n adico

o relacionados :: (a->a->Bool) -> [a] -> Bool tal que


7. Defina a funca
(relacionados p xs) verifica se todo par (x, y) de elementos consecutivos de xs
satisfazem o predicado p. Por exemplo,

o recursiva tal que horner cs z calcula o valor do


Complete a seguinte definica
polin
omio com lista de coeficientes cs no ponto z usando a forma de Horner.

r e l a c i o n a d o s (<) [ 2 , 3 , 7 , 9 ] = True
r e l a c i o n a d o s (<) [ 2 , 3 , 1 , 9 ] = F a l s e

horner : : [ Double ] > Double > Double


horner [ ] z = 0
horner ( c : c s ) z =

o recursiva para relacionadosRec.


(a) Escreva uma definica
o usando compreens
(b) Escreva uma definica
ao de listas relacionadosComp
o and.
com a funca

o da funca
o de ordem
A forma de Horner tambem pode ser expressa como aplicaca
o seguinte de forma a que a igualdade seja
superior foldr . Complete a definica
correta.

o agrupa :: Eq a => [[a]] -> [[a]] tal que (agrupa xss)


8. Defina a funca
e uma lista de listas obtidas agrupando os primeiros elementos, os segundos
elementos, ... de forma que o comprimento das listas dos resultados seja igual a
lista mais curta de xss. Por exemplo,

cs
horner cs z = foldr
o mapFold f :: [a] -> [a] usando a funca
o foldr.
18. Defina a funca
o filterFold p :: [a] -> [a] usando a funca
o foldr.
19. Define a funca

es foldl1 e foldr1 do prel


20. As funco
udio-padr
ao s
ao variantes de foldl e foldr que
s
o est
ao definidas para listas com pelo menos um elemento (i.e. n
ao-vazias).foldl1
o de agregaca
o e uma lista) e
e foldr1 tem apenas dois argumentos (uma operaca
es seguintes.
o seu resultado e dado pelas equaco
f oldl1()[x1 , . . . , xn ] = (. . . (x1 x2 ) x3 . . .) xn
f oldr1()[x1 , . . . , xn ] = x1 (. . . (xn1 xn ) . . .)
es maximoFold, minimoFold :: Ord a => [a] -> a do
Defina as funco
prel
udio-padr
ao (que calculam, respectivamente, o maior e o menor elemento
duma lista n
ao-vazia) usando foldl1 e foldr1 .
o recursiva da funca
o insert :: Ord a => a -> [a] -> [a]
21. Escreva definica
o correta de forma a manter
para inserir um elemento numa lista ordenada na posica
o.
a ordenaca
Exemplo: insert 2 [0, 1, 3, 5] == [0, 1, 2, 3, 5]
o insert, escreva uma definica
o tambem recursiva da funca
o
22. Usando a funca
o pelo metodo
insertSort :: Ord a => [a] -> [a] que implementa ordenaca
o:
de inserca
a lista vazia j
a est
a ordenada;
para ordenar uma lista n
ao vazia, recursivamente ordenamos a cauda e
o correta.
inserimos a cabeca na posica
o insertSortFold :: Ord a => [a] -> [a] que ordena uma
23. Defina a funca
o usando a funca
o foldr e insert.
lista pelo metodo de inserca
o scanSum :: [Int] -> [Int] recebe uma lista de inteiros e retorna uma
24. A funca
lista com as somas das somas acumuladas. Por exemplo,
scanSum [1,2,3,4] == [1,3,6,10]
scanSum [1,3,5,7] == [1,4,9,16]
o prefixos :: [Int] -> [[Int]] que retorna uma
(a) Defina uma funca
lista de prefixos de todos os prefixos de uma lista.
prefixos [1,2,3,4] == [ [1], [1,2], [1,2,3], [1,2,3,4] ]
prefixos []
p r e f i x o s xs

=
= prefixos

++ [ xs ]

o
(b) Defina scanSum usando compreens
ao de listas com o auxlio da funca
prefixos.
o scanSum recursivamente. Dica: use uma funca
o auxiliar
(c) Defina a funca