Uma função recursiva é uma função que se chama a si própria.
Uma função recursiva tem de ter pelo menos um caso base e pelo menos um caso recursivo.
Um caso base devolve um valor sem voltar a chamar a função. Um caso recursivo chama a função outra vez, modificando o valor de entrada para que em algum momento corresponda ao caso base.
Muitas vezes, cada caso é escrito na sua própria cláusula de função.
# base case
def count([]), do: 0
# recursive case
def count([_head | tail]), do: 1 + count(tail)
És um observador de aves entusiasta que acompanha quantas aves visitaram o teu jardim em cada dia.
Decidiste levar a tua observação de aves a um novo nível e implementar algumas ferramentas que te vão ajudar a acompanhar e a processar os dados.
Escolheste guardar os dados numa lista de números inteiros. O primeiro número da lista é o número de aves que visitaram o teu jardim hoje, o segundo ontem, e assim por diante.
Implementa a função BirdCount.today/1. Deve receber uma lista de contagens diárias de aves e devolver a contagem de hoje. Se a lista estiver vazia, deve devolver nil.
BirdCount.today([2, 5, 1])
# => 2
Implementa a função BirdCount.increment_day_count/1. Deve receber uma lista de contagens diárias de aves e incrementar a contagem de hoje em 1. Se a lista estiver vazia, devolve [1].
BirdCount.increment_day_count([4, 0, 2])
# => [5, 0, 2]
Implementa a função BirdCount.has_day_without_birds?/1. Deve receber uma lista de contagens diárias de aves. Deve devolver true se houve pelo menos um dia em que nenhuma ave visitou o jardim, e false caso contrário.
BirdCount.has_day_without_birds?([2, 0, 4])
# => true
BirdCount.has_day_without_birds?([3, 8, 1, 5])
# => false
Implementa a função BirdCount.total/1. Deve receber uma lista de contagens diárias de aves e devolver o número total que visitou o teu jardim desde que começaste a recolher os dados.
BirdCount.total([4, 0, 9, 0, 5])
# => 18
Alguns dias são mais movimentados do que outros. Um dia movimentado é aquele em que cinco ou mais aves visitaram o teu jardim.
Implementa a função BirdCount.busy_days/1. Deve receber uma lista de contagens diárias de aves e devolver o número de dias movimentados.
BirdCount.busy_days([4, 5, 0, 0, 6])
# => 2
Inscreve-te no Exercism para aprenderes e dominares Elixir com 58 conceitos168 exercícios, e mentoria humana real, tudo grátis.