تمارين عملية: FizzBuzz ومسائل الأعداد
تمارين عملية: FizzBuzz ومسائل الأعداد
لقد تعلّمت الآن جميع أدوات التحكم في التدفق والحلقات التي يوفّرها Java. يجمع هذا الدرس الأخير كل شيء معًا من خلال ثلاث مسائل كلاسيكية ستصادفها في المقابلات التقنية ومراجعات الكود الحقيقية: FizzBuzz، والكشف عن الأعداد الأولية، وحساب المضروب (Factorial). العمل على هذه المسائل يُدرّبك على عادة ترجمة المتطلّبات البشرية إلى Java نظيفة وصحيحة.
المسألة الأولى — FizzBuzz
المطلوب: اطبع الأرقام من 1 إلى 100. لمضاعفات 3 اطبع Fizz، ولمضاعفات 5 اطبع Buzz، ولمضاعفات 3 و5 معًا اطبع FizzBuzz.
النقطة الجوهرية هي ترتيب الشروط. يجب أن يأتي الشرط المشترك (% 3 == 0 && % 5 == 0) أوّلًا، وإلّا لن يُصل إليه أبدًا:
% 3 == 0 قبل الشرط المشترك، فإن الرقم 15 سيطبع Fizz ولن يصل أبدًا إلى FizzBuzz. ضع دائمًا الشرط الأكثر تحديدًا أوّلًا.
بديل نظيف يبني نص الإخراج قبل طباعته، مما يُجنّب تكرار System.out.println:
if واحدة فقط بدلًا من إعادة كتابة كل الفروع. كتابة كود سهل التوسعة علامة على الخبرة.
المسألة الثانية — الكشف عن الأعداد الأولية
العدد الأولي أكبر من 1 وليس له قواسم سوى 1 ونفسه. الأسلوب الساذج يتحقق من كل عدد من 2 حتى n - 1، لكننا نحتاج فقط للتحقق حتى Math.sqrt(n): إذا كان لـ n عامل أكبر من جذره التربيعي، فإن العامل الأصغر المقابل يكون قد وُجد بالفعل.
i * i <= n بدلًا من i <= Math.sqrt(n)؟ كلاهما صحيح. صيغة الضرب تتجنب استدعاء الجذر التربيعي بالفاصلة العائمة في كل تكرار، مما يجعل الحلقة أسرع قليلًا. للأعداد التي ستتعامل معها كمبتدئ الفرق غير ملحوظ، لكنها الطريقة المعتادة في Java.
المسألة الثالثة — المضروب (Factorial)
مضروب العدد الصحيح غير السالب n (يُكتب n!) هو حاصل ضرب كل الأعداد الصحيحة الموجبة من 1 إلى n. بالتعريف، 0! = 1.
النسخة التكرارية — بسيطة وفعّالة:
لاحظ أن نوع القيمة المُعادة long وليس int. حتى 13! (6,227,020,800) يتجاوز حدود int ذي 32 بتًا، لذا استخدام long يعطيك نتائج آمنة حتى 20!.
factorial(n) = n * factorial(n - 1). الصيغة التكرارية أعلاه مُفضَّلة في الإنتاج لأنها لا تخاطر بتجاوز المكدّس (stack overflow) للمدخلات الكبيرة وأسهل في الفهم.
الجمع بين المفاهيم
المسائل الثلاث تتبع النمط ذاته الذي مارسته طوال هذه الوحدة:
- اقرأ القاعدة بلغة عادية.
- اختر الحلقة المناسبة (
forلنطاق معروف،whileعندما يكون شرط الخروج ديناميكيًا). - داخل الحلقة، اكتب شروط
if/else if/elseمرتّبة من الأكثر تحديدًا إلى الأقل. - استخدم
breakأوreturnالمبكّر لإيقاف التكرار فور الحصول على الإجابة — لا تكمل الحلقة دون داعٍ.
الخلاصة
لقد أكملت الآن وحدة التحكم في التدفق والحلقات. علّمتك FizzBuzz الترتيب الصحيح للشروط وأنماط بناء النصوص. وضّح اكتشاف الأعداد الأولية كيف أن ملاحظة رياضية واحدة (حدّ الجذر التربيعي) تحوّل حلقة بطيئة إلى حلقة سريعة. أثبت المضروب أهمية اختيار النوع الصحيح للأعداد وقيمة الحلول التكرارية على التعاودية للتراكمات البسيطة. هذه المسائل الثلاث أساس متين لكل تحدٍّ خوارزمي قادم.