遞迴函式就是會呼叫自己的函式。
一個遞迴函式至少需要一個_基本情況_和一個_遞迴情況_。
_基本情況_會回傳一個值,而不會再次呼叫函式。_遞迴情況_則會再次呼叫函式,並修改輸入,讓它在某個時間點符合基本情況。
很多時候,每種情況會寫在各自的函式子句裡。
# 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