새 세기

새 세기

학습 연습 문제

소개

재귀

재귀 함수는 스스로를 호출하는 함수예요.

재귀 함수에는 적어도 하나의 _기저 사례_와 적어도 하나의 _재귀 사례_가 있어야 해요.

_기저 사례_는 함수를 다시 호출하지 않고 값을 반환해요. _재귀 사례_는 함수를 다시 호출하는데, 언젠가는 기저 사례와 일치하도록 입력을 바꿔서 호출해요.

흔히 각 사례는 각자의 함수 절에 따로 작성해요.

# base case
def count([]), do: 0

# recursive case
def count([_head | tail]), do: 1 + count(tail)

지침

하루에 정원에 새가 몇 마리 찾아왔는지 꾸준히 기록하는 열렬한 탐조가예요.

이제 탐조를 한 단계 더 발전시켜, 데이터를 기록하고 처리하는 데 도움이 될 도구 몇 가지를 직접 만들어 보기로 했어요.

데이터는 정수 배열로 저장하기로 했어요. 배열의 첫 번째 숫자는 오늘 정원을 찾아온 새의 수이고, 두 번째는 어제, 그다음도 같은 식이에요.

1. 오늘 몇 마리의 새가 찾아왔는지 확인해요

BirdCount.today/1 함수를 구현해요. 날짜별 새 개수를 담은 배열을 받아 오늘의 개수를 반환해야 해요. 배열이 비어 있으면 nil을 반환해요.

BirdCount.today([2, 5, 1])
# => 2

2. 오늘의 개수를 증가시켜요

BirdCount.increment_day_count/1 함수를 구현해요. 날짜별 새 개수를 담은 배열을 받아 오늘의 개수를 1만큼 증가시켜야 해요. 배열이 비어 있으면 [1]을 반환해요.

BirdCount.increment_day_count([4, 0, 2])
# => [5, 0, 2]

3. 새가 한 마리도 찾아오지 않은 날이 있었는지 확인해요

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

4. 찾아온 새의 총 개수를 계산해요

BirdCount.total/1 함수를 구현해요. 날짜별 새 개수를 담은 배열을 받아, 데이터를 수집하기 시작한 이후로 정원을 찾아온 새의 총 개수를 반환해야 해요.

BirdCount.total([4, 0, 9, 0, 5])
# => 18

5. 바쁜 날의 수를 계산해요

어떤 날은 다른 날보다 더 바빠요. 새가 다섯 마리 이상 정원을 찾아온 날을 바쁜 날이라고 해요.

BirdCount.busy_days/1 함수를 구현해요. 날짜별 새 개수를 담은 배열을 받아 바쁜 날의 수를 반환해야 해요.

BirdCount.busy_days([4, 5, 0, 0, 6])
# => 2
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Elixir Exercism

새 세기 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Elixir 트랙을 개념 58개연습 문제 168개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.