دالة الاستدعاء الذاتي: العد التنازلي
جزء من قسم المنطق وتدفق التنفيذ في رحلة 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!" ويتوقف.
التحدي
سهلأنشئ برنامجًا ينفّذ مؤقّت عدّ تنازلي recursive مع رسائل مخصّصة. سيعرض برنامجك مفهوم الاستدعاء الذاتي recursive من خلال العدّ التنازلي بدءًا من number معيّن وعرض رسائل مخصّصة في كل step.
- اقرأ إدخالًا من النوع string يمثّل number الابتدائي للعدّ التنازلي
- اقرأ إدخالًا من النوع string يمثّل بادئة رسالة مخصّصة (مثل
"Launch in"أو"Timer"أو"Countdown") - حوّل الإدخال الأول إلى integer باستخدام
int.parse() - أنشئ function recursive باسم
customCountdownتأخذ معاملين: - عددًا صحيحًا
numberيمثّل قيمة العدّ التنازلي الحالية - سلسلة نصية
messagePrefixللرسالة المخصّصة - يجب أن تنفّذ function المنطق التالي:
- حالة Base: إذا كان number أقل من أو يساوي 0، اطبع
"Countdown complete!"ثم نفّذ return - الخطوة recursive: اطبع بادئة الرسالة متبوعةً بـ number الحالي، ثم استدعِ function نفسها باستخدام
number - 1 - استدعِ function
customCountdownباستخدام number المحوّل وبادئة الرسالة - اعرض النتائج بالتنسيق المطابق تمامًا للتنسيق الموضّح أدناه
على سبيل المثال، إذا كانت المدخلات هي "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
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق التنفيذ
1التعامل المتقدم مع القوائم
خصائص القائمة: first و lastحالة القائمة: isEmpty و isNotEmptyعكس القائمةالإضافة إلى القائمة: insertالحذف من القائمة: removeWhereالبحث في القائمة: indexOfفرز القائمةخلط القائمةملخص - منظم القوائم4معالجة الـ Map المتقدمة
التكرار عبر الـ Mapالتحقق من المفاتيح والقيمخصائص الـ Map: keys و valuesإضافة مشروطة: putIfAbsentإزالة العناصر من الـ Mapالـ Maps المتداخلةمراجعة - تحديث المخزون7الدوال المتقدمة
الدوال المجهولةتمرير الدوال كوسطاءفهم الـ Closuresمقدمة في الاستدعاء الذاتيدالة الاستدعاء الذاتي: العد التنازليدالة الاستدعاء الذاتي: العامليمراجعة - معالج القوائم2عمليات القوائم الوظيفية
التحويل باستخدام 'map'التصفية باستخدام 'where'استخدام '.toList()'التحقق من الشروط باستخدام 'any'الشروط باستخدام 'every'البحث باستخدام 'firstWhere'مراجعة - تصفية البيانات5مشروع: حاسبة عربة التسوق
إعداد المشروعإضافة العناصر إلى العربة3المجموعات
ما هي المجموعة؟إنشاء مجموعةالإضافة والحذف من المجموعاتالتحقق من وجود عناصر في المجموعةتحويل قائمة إلى مجموعةاتحاد المجموعاتتقاطع المجموعاتالفرق بين المجموعاتمراجعة - قائمة ضيوف فريدةتدرّب بنفسك: مترجم Dart عبر الإنترنت