Questão 13: inits
Voltar
Apresente uma definição recursiva da função (pré-definida) inits :: [a] -> [[a]]
que calcula a lista dos prefixos de uma lista.
Exemplo
> inits [11,21,13]
[[],[11],[11,21],[11,21,13]]
Resolução
inits :: [a] -> [[a]]
inits [] = [[]]
inits l = inits (init l) ++ [l]
Explicação
De modo a definir a função inits
, precisamos primeiro de conhecer a função pré-definida init
. Esta função, a partir de uma lista, devolve o seu prefixo, isto é, retira o seu último elemento. Por exemplo, init [1,2,3,4] = [1,2,3]
.
Sabemos que o resultado de inits [1,2,3,4]
deverá ser [[],[1],[1,2],[1,2,3],[1,2,3,4]]
. Ora, sabendo o que a função init
faz, encontramos aqui um padrão. Cada sub-lista, da direita para a esquerda, é igual à sub-lista anterior, tirando o último elemento, que desaparece. Ora, que função é que retira o último elemento de uma lista? Exato, init
!
Ficamos assim a saber que, para cada sub-lista do resultado, a sub-lista à sua esquerda terá que ser o resultado de aplicar a função init
a si mesma, de forma recursiva.
Obtemos assim:
inits l = inits (init l) ++ [l]
Agora acrescentamos o caso de paragem e ficamos com a função definida:
inits :: [a] -> [[a]]
inits [] = [[]]
inits l = inits (init l) ++ [l]