재귀 함수는 스스로를 호출하는 함수예요.
재귀 함수에는 적어도 하나의 _기저 사례_와 적어도 하나의 _재귀 사례_가 있어야 해요.
_기저 사례_는 함수를 다시 호출하지 않고 값을 반환해요. _재귀 사례_는 함수를 다시 호출하는데, 언젠가는 기저 사례와 일치하도록 입력을 바꿔서 호출해요.
흔히 각 사례는 각자의 함수 절에 따로 작성해요.
# base case
def count([]), do: 0
# recursive case
def count([_head | tail]), do: 1 + count(tail)
하루에 정원에 새가 몇 마리 찾아왔는지 꾸준히 기록하는 열렬한 탐조가예요.
이제 탐조를 한 단계 더 발전시켜, 데이터를 기록하고 처리하는 데 도움이 될 도구 몇 가지를 직접 만들어 보기로 했어요.
데이터는 정수 배열로 저장하기로 했어요. 배열의 첫 번째 숫자는 오늘 정원을 찾아온 새의 수이고, 두 번째는 어제, 그다음도 같은 식이에요.
BirdCount.today/1 함수를 구현해요. 날짜별 새 개수를 담은 배열을 받아 오늘의 개수를 반환해야 해요. 배열이 비어 있으면 nil을 반환해요.
BirdCount.today([2, 5, 1])
# => 2
BirdCount.increment_day_count/1 함수를 구현해요. 날짜별 새 개수를 담은 배열을 받아 오늘의 개수를 1만큼 증가시켜야 해요. 배열이 비어 있으면 [1]을 반환해요.
BirdCount.increment_day_count([4, 0, 2])
# => [5, 0, 2]
BirdCount.has_day_without_birds?/1 함수를 구현해요. 날짜별 새 개수를 담은 배열을 받아요. 새가 정원을 찾아오지 않은 날이 하루라도 있으면 true를, 그렇지 않으면 false를 반환해야 해요.
BirdCount.has_day_without_birds?([2, 0, 4])
# => true
BirdCount.has_day_without_birds?([3, 8, 1, 5])
# => false
BirdCount.total/1 함수를 구현해요. 날짜별 새 개수를 담은 배열을 받아, 데이터를 수집하기 시작한 이후로 정원을 찾아온 새의 총 개수를 반환해야 해요.
BirdCount.total([4, 0, 9, 0, 5])
# => 18
어떤 날은 다른 날보다 더 바빠요. 새가 다섯 마리 이상 정원을 찾아온 날을 바쁜 날이라고 해요.
BirdCount.busy_days/1 함수를 구현해요. 날짜별 새 개수를 담은 배열을 받아 바쁜 날의 수를 반환해야 해요.
BirdCount.busy_days([4, 5, 0, 0, 6])
# => 2
Exercism에 가입하고 Elixir 트랙을 개념 58개연습 문제 168개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.