Free Palestine and Lebanon 🍉 Stop the Genocide
Haskell Logo

Programação Funcional

Questão 25: elemIndices

Voltar

Apresente uma definição recursiva da função (pré-definida) elemIndices :: Eq a => a -> [a] -> [Int] que calcula a lista de posições em que um dado elemento ocorre numa lista.

Exemplo

> elemIndices 3 [1,2,3,4,3,2,3,4,5]
[2,4,6]

Resolução

Clica para revelar

elemIndices :: Eq a => a -> [a] -> [Int]
elemIndices x l = elemIndicesAux x l 0

elemIndicesAux :: Eq a => a -> [a] -> Int -> [Int]
elemIndicesAux _ [] _ = []
elemIndicesAux x (h:t) i -- a variável `i` indica-nos qual o índice do elemento da lista que estamos a consultar
    | x == h = i : elemIndicesAux x t (i+1)
    | otherwise = elemIndicesAux x t (i+1)

Resolução

Clica para revelar

elemIndices :: Eq a => a -> [a] -> [Int]
elemIndices _ [] = []
elemIndices x (h:t)
    | x == h = 0 : map (+1) (elemIndices x t)
    | otherwise = map (+1) (elemIndices x t)