Free Palestine and Lebanon 🍉 Stop the Genocide
Haskell Logo

Programação Funcional

Questão 5: reverse

Voltar

Apresente uma definição recursiva da função (pré-definida) reverse :: [a] -> [a] que dada uma lista calcula uma lista com os elementos dessa lista pela ordem inversa.

Exemplo

> reverse [10,20,30]
[30,20,10]

Resolução

Clica para revelar

reverse :: [a] -> [a]
reverse [] = []
reverse (h:t) = reverse t ++ [h]

Explicação

Clica para revelar

A definição desta função é trivial, dado que já sabemos percorrer listas de forma recursiva.

Para uma lista (h:t), se quisermos a sua inversa, a primeira coisa que temos de fazer é colocar h no fim da lista, ou seja, o primeiro elemento passa a ser o último. Temos assim reverse (h:t) = ?? ++ [h] (já definimos (++) na questão 3, por isso não vale a pena explicar aqui o que faz).

A melhor forma de descobrir o que deverá ser ?? é usar um exemplo concreto. Para a lista [1,2,3], podemos fazer reverse (1:[2,3]) = ?? ++ [1]. Ora, sabemos que a inversa de [1,2,3] tem que ser [3,2,1], ou, por outras palavras, [3,2] ++ [1]. Logo, neste caso, ?? = [3,2], que não é nada mais do que a inversa da cauda da lista inicial.

Desta forma, podemos definir reverse (h:t) = reverse t ++ [h].

Agora, apenas nos falta o caso de paragem. Com a prática que já temos, chegamos rapidamente a reverse [] = [].

Temos assim a nossa função final:

reverse :: [a] -> [a]
reverse [] = []
reverse (h:t) = reverse t ++ [h]