Anda di halaman 1dari 1

o elem ::

Dica: use a funca


pertence a uma lista.

(i) union :: Eq a => [a] -> [a] -> [a] tal que (union xs ys) e a uni
ao
dos conjuntos xs e ys. Por exemplo,

o Funcional
Programaca
Folha de Exerccios 03

union [ 3 , 2 , 5 ] [ 5 , 7 , 3 , 4 ] == [ 3 , 2 , 5 , 7 , 4 ]
o notElem ::
Dica: use a funca
elemento n
ao pertence a uma lista.

d i f e r e n c i a [ 3 , 2 , 5 , 6 ] [ 5 , 7 , 3 , 4 ] == [ 2 , 6 ]
d i f e r e n c i a [ 3 , 2 , 5 ] [ 5 , 7 , 3 , 2 ] == [ ]
o frequencia :: a -> [a] -> Int tal que (frequencia
(k) Defina a funca
x xs) devolve o n
umero de ocorrencias de x em u. Por exemplo,

es:
1. Quais s
ao os tipos das seguintes funco
(a) remove x [ ] = [ ]
remove x ( y : y s ) = i f x == y then y s e l s e y : ( remove x y s )
Eq a => a -> [a] -> [a]

(b) p a r t e s [ ] = [ [ ] ]
p a r t e s ( x : xs ) = [ x : y | y < p a r t e s xs ] ++ p a r t e s xs

f r e q u e n c i a 5 [ 4 , 5 , 2 , 1 , 5 , 5 , 9 ] == 3
o unico :: Eq a => a -> [a] -> Bool tal que (unico
(l) Defina a funca
x xs) devolve True se x ocorre exatamente uma vez em u e False, caso
contr
ario.
u ni c o 2 [ 1 , 2 , 3 , 2 ] == F a l s e
u ni c o 2 [ 3 , 1 ] == F a l s e
u ni c o 2 [ 2 ] == True

(c) rota n xs = drop n xs ++ take n xs

o notElem ::
Dica: use a funca

(d) swap (x,y) = (y,x)

Eq a => a -> [a] -> Bool

(m) Dado uma lista de n


umeros inteiros, definiremos o maior salto como o maior
valor das diferencas (em valor absoluto) entre n
umeros consecutivos da lista.
Por exemplo, dada uma lista [2,5,-3,7]

(e) twice f x = f (f x)
o da quest
2. Explique o que cada funca
ao anterior faz?
es usando apenas funco
es pre-definidas em
3. Defina cada uma das seguintes funco
Haskell:

3 (valor absoluto de 2 - 5)
8 (valor absoluto de 5 - (-3))
10 (valor absoluto de -3 - 7)

(a) prodIntervalo :: Int -> Int -> Int que, dados dois valores inteiros n
e m, retornar o produto de todos os valores inteiros entre n e m (inclusive).
Por exemplo,
prodIntervalo 2 5 == 5i=2 i == 2 * 3 * 4 * 5 == 120
o product.
Dica: Use a funca

Portanto o maior salto e 10. N


ao esta definido o maior salto para uma lista
o maiorSalto :: [Integer]
com menos de 2 elementos. Defina a funca
-> Integer tal que maiorSalto xs e o maior salto da lista xs. Por exemplo,
m a i o r S a l t o [ 1 , 5 ] == 4
m a i o r S a l t o [10 , 10 ,1 ,4 ,20 , 2] == 22

(b) somaIntervalo :: Int -> Int -> Int que, dados dois valores inteiros n
e m, retornar o produto de todos os valores inteiros entre n e m (inclusive).
Por exemplo,
P5
somaIntervalo 2 5 ==
i=2 i == 2 + 3 + 4 + 5 == 14
o sum.
Dica: Use a funca

(n) 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 :
P (z) = c0+c1 z+. . .+cn zn = c0 +z(c1 +z(. . .+z(cn1 +zcn ) . . .))
(1)
Note que usando a express
ao n
ao necessitamos de calcular potencias: para
es e n
calcular o valor dum polin
omio de grau n usamos apenas n adico
produtos.
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.

o metades :: [a] -> ([a],[a]) tal que (metades xs) e


(c) Defina a funca
formada pelo par formado por duas listas obtida pela divis
ao de xs em que a
cardinalidade das listas diferem no m
aximo em um.
metades [2,3,5,7,9] == ([2,3],[5,7,9])
o splitAt :: Int -> [a] -> ([a], [a])
Dica: Use a funca
es usando recurs
4. Defina cada uma das seguintes funco
ao:

horner : : [ Double ] > Double > Double


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

o potencia :: Integer -> Integer -> Integer tal que


(a) Defina a funca
(potencia x n) e x elevado ao n
umero natual n. Por exemplo,
potencia 2 3 == 8

o length, que computa o n


(o) A funca
umero de elementos de uma lista, pode ser
definida do seguinte modo:

o elemento :: Eq a => a -> [a] -> Bool tal que


(b) Defina a funca
(elemento x xs) verifica se x pertence a lista xs. Por exemplo, elemento
3 [2,3,5] == True

length xs = length 0 xs
where length n [ ] = n
length n ( x : xs ) = length ( n+1) xs

o seleciona :: Int -> [a] -> a tal que (seleciona n xs)


(c) Defina a funca
e o n-esimo elemento de xs. Por exemplo, seleciona 2 [2,3,5,7] == 5
o refinada :: [Float] -> [Float] tal que (refinada xs)
(d) Defina a funca
e uma lista obtida intercalando dois elementos consecutivos de xs com a
media aritmetica deles. Por exemplo,
r e f i n a d a [ 2 , 7 , 1 , 8 ] == [ 2 . 0 , 4 . 5 , 7 . 0 , 4 . 0 , 1 . 0 , 4 . 5 , 8 . 0 ]
r e f i n a d a [2 ] == [ 2 . 0 ]
r e f i n a d a [ ] == [ ]
o merge :: [a] -> [a] -> [a] tal que (merge xs ys) e
(e) Defina a funca
uma lista ordenada obtida pela entrelacamento de duas listas ordenadas xs
e ys. Por exemplo,
merge [2,5,6] [1,3,4] == [1,2,3,4,5,6]

i. fac :: Int -> Int, que computa o fatorial de um n


umero natural
ii. reverse :: [a] -> [a], que inverte uma lista.

remove 2 [ 1 , 2 , 5 , 2 , 4 , 3 , 2 ] == [ 1 , 5 , 4 , 3 ]
o unique :: Eq a => [a] -> [a] tal que (unique xs)
(q) Defina uma funca
es.
devolve uma lista com os elementos de xs sem repetico

uma lista vazia ou com um s


o elemento j
a est
a ordenada;
para ordenar uma lista com dois ou mais elementos, partimos em
duas metades, recursivamente ordenamos as duas parte e juntamos
os resultados usando merge.
tal

o usa a funca
o auxiliar length, que possui um par
Essa funca
ametro adicional
o length e definida usando recurs
para acumular o resultado. A funca
ao
de cauda, uma vez que a chamada recursiva length (n+1) xs, usada no
o, n
lado direito da definica
ao ocorre dentro de nenhum argumento de outra
o. Use essa tecnica de recurs
funca
ao de cauda para definir as seguintes
es:
funco

o remove :: Eq a => a -> [a] -> [a] tal que


(p) Defina uma funca
(remove x xs) devolve uma lista obtida removendo todas as ocorrencias
de x em xs. Por exemplo,

o merge e metades, escreva uma definica


o recursiva da
(f) Usando a funca
o mergesort :: Ord a => [a] -> [a] que implementa o metodo
funca
merge sort :

o ordenada :: Ord a => [a] -> Bool


(g) Defina uma funca
ordenada xs verifica se xs e uma lista ordenada. Por exemplo,

a -> [a] -> Bool verifica se um

(j) diferencia :: Eq a => [a] -> [a] -> [a] tal que (diferencia xs ys) e
a diferenca entre os conjuntos xs e ys. Por exemplo,

Prof. Wladimir Ara


ujo Tavares

remove ::

a -> [a] -> Bool verifica se um elemento

unique [ 1 , 2 , 5 , 2 , 5 , 7 , 2 , 5 ] == [ 1 , 2 , 5 , 7 ]
o inserir :: Ord a => a -> [a] -> [a] tal que
(r) Defina uma funca
(inserir x xs) devolve uma lista ordenada ascendentemente, oriunda da
o apropriada de x em xs. Por exemplo,
inserca
inserir 3 [2,7,12]

que

ordenada [ 2 , 3 , 5 ] == True
ordenada [ 2 , 5 , 3 ] == F a l s e

o permutations :: [a] -> [[a]] para obter a lista


(s) Escreva uma funca
es dos elementos uma lista. Assim, se xs tem
com todas as permutaco
comprimento n, ent
ao permutations xs tem comprimento n!.
Exemplo:
permutations [1, 2, 3] = [[1, 2, 3], [2, 1, 3], [2,
3, 1], [1, 3, 2], [3, 1, 2], [3, 2, 1]]
es n
Note que a ordem das permutaco
ao e importante.

(h) subconjunto :: Eq a => [a] -> [a] -> Bool tal que (subconjunto xs
ys) verifica xs e um subconjunto de ys. Por exemplo,
s u b c o n j u n t o [ 3 , 2 , 3 ] [ 2 , 5 , 3 , 5 ] == True
s u b c o n j u n t o [ 3 , 2 , 3 ] [ 2 , 5 , 6 , 5 ] == F a l s e

Anda mungkin juga menyukai