توابع بازگشتی توابعی هستند که خودشان را فراخوانی میکنند.
یک تابع بازگشتی باید دستکم یک «حالت پایه» و دستکم یک «حالت بازگشتی» داشته باشد.
«حالت پایه» مقداری را برمیگرداند بدون اینکه تابع را دوباره فراخوانی کند. «حالت بازگشتی» تابع را دوباره فراخوانی میکند و ورودی را طوری تغییر میدهد که در نقطهای با حالت پایه مطابقت پیدا کند.
بسیار پیش میآید که هر حالت در «بند تابع» خودش نوشته میشود.
# 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] را برگردانید.
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