الدوال الاستدعائية الذاتية هي دوال تستدعي نفسها.
تحتاج الدالة الاستدعائية الذاتية إلى حالة أساسية واحدة على الأقل وإلى حالة استدعائية واحدة على الأقل.
تُرجع الحالة الأساسية قيمة دون أن تستدعي الدالة مرة أخرى. أما الحالة الاستدعائية فتستدعي الدالة مرة أخرى، مع تعديل المدخل بحيث يطابق الحالة الأساسية في مرحلة ما.
غالبًا ما تُكتب كل حالة في جملة خاصة بها من جمل الدالة.
# 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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.