A ideia que está na base destas funções é que elas vão ter um parâmetro extra (o acumulador) onde a resposta vai sendo construída e gravada à medida que a recursão progride.
O acumulador vai sendo atualizado e passada como parâmetro nas sucessivas chamadas da função.
Uma vez que o acumulador vai guardando a resposta da função, o seu tipo deve ser igual ao tipo do resultado da função.
- Exemplo : A função que inverte uma lista
Podemos sistematizar as seguintes regras para definir funções usando esta técnica :
- Colocar o acumulador como um parâmetro extra.
- O acumulador deve ser do mesmo tipo que o do resultado da função.
- Devolver o acumulador no acaso de paragem da função.
- Atualizar o acumulador na chamada recursiva da função.
- A função principal (sem acumulador) chama a função com o parâmetro de acumulação, inicializando o acumulador.
- Exemplo : O somatório de uma lista de números.
- Exemplo : O máximo de uma lista não vazia
- Exemplo : A função fatorial.
- A função stringToInt : : String -> Int que converte uma string (representando um número) num valor inteiro (ex.: stringToInt "5247" = 5247)