Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

دالة الاستدعاء الذاتي: العد التنازلي

جزء من قسم المنطق وتدفق التنفيذ في رحلة Dart على Coddy. الدرس 48 من 65.

حان الوقت الآن لتطبيق الاستدعاء الذاتي عمليًا باستخدام دالة عدّ تنازلي بسيطة. سيساعدك هذا التمرين على فهم كيفية عمل حالة الأساس والخطوة الاستدعائية معًا في التعليمات البرمجية الفعلية.

تبدأ دالة countdown برقم وتطبع كل رقم تنازليًا حتى الصفر. إليك كيفية عمل الاستدعاء الذاتي: إذا كان الرقم أكبر من الصفر، فاطبعه ثم استدعِ الدالة نفسها برقم أصغر. عندما يصل الرقم إلى الصفر، توقّف.

void countdown(int number) {
  if (number <= 0) {
    print("Done!");
    return; // الحالة الأساسية - توقف هنا
  }
  
  print(number);
  countdown(number - 1); // الخطوة العودية
}

تتحقق حالة Base مما إذا كان number <= 0 - وهذا هو الوقت الذي نتوقف فيه عن استدعاء الدالة. تستدعي الخطوة recursive countdown(number - 1)، وهي المشكلة نفسها ولكن مع input أصغر، مما يقرّبنا تدريجيًا من حالة Base.

عند استدعاء countdown(3)، تتم طباعة 3، ثم يتم استدعاء countdown(2)، الذي يطبع 2، ثم يتم استدعاء countdown(1)، الذي يطبع 1، ثم يتم استدعاء countdown(0)، الذي يطبع "Done!" ويتوقف.

challenge icon

التحدي

سهل

أنشئ برنامجًا ينفّذ مؤقّت عدّ تنازلي recursive مع رسائل مخصّصة. سيعرض برنامجك مفهوم الاستدعاء الذاتي recursive من خلال العدّ التنازلي بدءًا من number معيّن وعرض رسائل مخصّصة في كل step.

  1. اقرأ إدخالًا من النوع string يمثّل number الابتدائي للعدّ التنازلي
  2. اقرأ إدخالًا من النوع string يمثّل بادئة رسالة مخصّصة (مثل "Launch in" أو "Timer" أو "Countdown")
  3. حوّل الإدخال الأول إلى integer باستخدام int.parse()
  4. أنشئ function recursive باسم customCountdown تأخذ معاملين:
    • عددًا صحيحًا number يمثّل قيمة العدّ التنازلي الحالية
    • سلسلة نصية messagePrefix للرسالة المخصّصة
  5. يجب أن تنفّذ function المنطق التالي:
    • حالة Base: إذا كان number أقل من أو يساوي 0، اطبع "Countdown complete!" ثم نفّذ return
    • الخطوة recursive: اطبع بادئة الرسالة متبوعةً بـ number الحالي، ثم استدعِ function نفسها باستخدام number - 1
  6. استدعِ function customCountdown باستخدام number المحوّل وبادئة الرسالة
  7. اعرض النتائج بالتنسيق المطابق تمامًا للتنسيق الموضّح أدناه

على سبيل المثال، إذا كانت المدخلات هي "5" و"Launch in"، فيجب أن يعرض برنامجك:

Starting countdown from: 5
Message prefix: Launch in
========================
Launch in 5
Launch in 4
Launch in 3
Launch in 2
Launch in 1
Countdown complete!

إذا كانت المدخلات هي "3" و"Timer"، فيجب أن يعرض برنامجك:

Starting countdown from: 3
Message prefix: Timer
========================
Timer 3
Timer 2
Timer 1
Countdown complete!

إذا كانت المدخلات هي "0" و"Ready"، فيجب أن يعرض برنامجك:

Starting countdown from: 0
Message prefix: Ready
========================
Countdown complete!

يجب أن ينفّذ برنامجك function customCountdown recursive التي تستدعي نفسها باستخدام number متناقصًا حتى تصل إلى حالة Base. يجب أن تطبع function الرسالة المخصّصة مع number الحالي في كل استدعاء recursive، موضّحةً كيفية تقسيم الاستدعاء الذاتي للمشكلة إلى مشكلات فرعية أصغر ومتماثلة. استخدم استيفاء السلاسل النصية لتنسيق رسائل العدّ التنازلي بالشكل "$messagePrefix $number".

جرّب بنفسك

import 'dart:io';

// TODO: أنشئ دالة customCountdown الخاصة بك هنا
// تذكر التعامل مع الحالة الأساسية (number <= 0) والخطوة التكرارية

void main() {
  // قراءة المدخلات
  String? startingNumber = stdin.readLineSync();
  String? messagePrefix = stdin.readLineSync();
  
  // تحويل السلسلة النصية إلى عدد صحيح
  int number = int.parse(startingNumber!);
  
  // عرض المعلومات الأولية
  print('Starting countdown from: $number');
  print('Message prefix: $messagePrefix');
  print('========================');
  
  // TODO: استدعِ دالة customCountdown الخاصة بك هنا
  // Remember to handle null safety for messagePrefix
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المنطق وتدفق التنفيذ

تدرّب بنفسك: مترجم Dart عبر الإنترنت