برمجة لغز أبراج هانوي باستخدام لغة بايثون
مقدمة
يعد لغز أبراج هانوي واحدًا من أشهر الألغاز الرياضية التي ظهرت لأول مرة في عام 1883 على يد عالم الرياضيات الفرنسي إدوارد لوفره. يهدف هذا اللغز إلى نقل مجموعة من الأقراص من برج إلى آخر وفقًا لقواعد معينة. إن لغز أبراج هانوي يشكل تحديًا ممتازًا في البرمجة، حيث يتيح للمبرمجين فهم العديد من المفاهيم الأساسية مثل الاستدعاء الذاتي (Recursion) والمصفوفات. سنقوم في هذا المقال بشرح كيفية حل اللغز باستخدام لغة البرمجة بايثون، مع توضيح المفاهيم المتعلقة به بشكل تفصيلي.
تعريف لغز أبراج هانوي
يتكون لغز أبراج هانوي من ثلاث أعمدة (أو أبراج) وعدد من الأقراص التي تختلف في الحجم. الهدف هو نقل جميع الأقراص من البرج الأول إلى البرج الثالث، مع الالتزام بالقواعد التالية:
-
يمكن تحريك قرص واحد فقط في كل خطوة.
-
لا يمكن وضع قرص أكبر فوق قرص أصغر.
-
يجب استخدام البرج الثاني كمساعدة في العمليات.
الفكرة الأساسية لحل اللغز
بما أن هذا اللغز يعتمد على قواعد معينة، يمكن استخدام البرمجة باستخدام الاستدعاء الذاتي (Recursion) لحل المشكلة بطريقة منهجية. تعتمد فكرة الحل على تقسيم المشكلة إلى أجزاء أصغر يمكن التعامل معها بشكل أسهل.
المبدأ الأساسي:
-
نبدأ بنقل الأقراص من البرج الأول إلى البرج الثالث باستخدام البرج الثاني كمساعد.
-
يتم تقسيم هذه العملية إلى عدة خطوات:
-
نقل كل الأقراص باستثناء القرص الأخير من البرج الأول إلى البرج الثاني.
-
نقل القرص الأخير من البرج الأول إلى البرج الثالث.
-
نقل الأقراص من البرج الثاني إلى البرج الثالث باستخدام البرج الأول كمساعد.
-
كيفية حل اللغز باستخدام الاستدعاء الذاتي (Recursion)
الاستدعاء الذاتي هو طريقة في البرمجة حيث تستدعي الدالة نفسها لحل المشكلة بشكل تدريجي. وفي حالة لغز أبراج هانوي، سنحتاج إلى دالة تقوم بحل اللغز باستخدام هذه الطريقة. عند حل هذا اللغز باستخدام الاستدعاء الذاتي، يتم تجزئة المهمة إلى مهام أصغر حتى يتم الوصول إلى الحالة البسيطة.
الخطوات البرمجية في بايثون
فيما يلي شرح مفصل لكيفية كتابة البرنامج باستخدام بايثون:
1. الدالة الأساسية لحل اللغز
لنبدأ بكتابة دالة hanoi(n, source, target, auxiliary) حيث:
-
nهو عدد الأقراص. -
sourceهو البرج الذي يحتوي على الأقراص. -
targetهو البرج الذي نريد نقل الأقراص إليه. -
auxiliaryهو البرج المساعد الذي سيتم استخدامه لنقل الأقراص بشكل غير مباشر.
pythondef hanoi(n, source, target, auxiliary):
if n == 1:
print(f"Move disk 1 from {source} to {target}")
return
hanoi(n-1, source, auxiliary, target)
print(f"Move disk {n} from {source} to {target}")
hanoi(n-1, auxiliary, target, source)
2. شرح الدالة:
-
إذا كان عدد الأقراص
nيساوي 1، يتم نقل القرص من البرج المصدر إلى البرج الهدف. -
إذا كان عدد الأقراص أكبر من 1، يتم تقسيم العملية إلى جزئين:
-
نقل
n-1أقراص من البرج المصدر إلى البرج المساعد. -
نقل القرص الأخير من البرج المصدر إلى البرج الهدف.
-
نقل الأقراص
n-1من البرج المساعد إلى البرج الهدف.
-
3. تشغيل البرنامج
الآن يمكننا استدعاء هذه الدالة لحل اللغز. على سبيل المثال، إذا أردنا حل اللغز لعدد 3 أقراص مع استخدام البرج A كمصدر، والبرج C كهدف، والبرج B كمساعد:
pythonhanoi(3, 'A', 'C', 'B')
مخرجات البرنامج
عند تنفيذ البرنامج مع 3 أقراص، ستتم طباعة سلسلة من الحركات التي توضح كيفية نقل الأقراص بين الأبراج:
cssMove disk 1 from A to C
Move disk 2 from A to B
Move disk 1 from C to B
Move disk 3 from A to C
Move disk 1 from B to A
Move disk 2 from B to C
Move disk 1 from A to C
تحسينات على البرنامج
-
إضافة التأخير بين الحركات: قد يرغب البعض في إضافة تأخير بين الحركات لإظهار كيفية تنفيذ الحركات بشكل تدريجي. يمكن تحقيق ذلك باستخدام مكتبة
timeفي بايثون.pythonimport time def hanoi(n, source, target, auxiliary): if n == 1: print(f"Move disk 1 from {source} to {target}") time.sleep(1) return hanoi(n-1, source, auxiliary, target) print(f"Move disk {n} from {source} to {target}") time.sleep(1) hanoi(n-1, auxiliary, target, source) -
استخدام واجهة رسومية (GUI): يمكن تحسين تجربة المستخدم عن طريق إضافة واجهة رسومية لعرض الحركة البصرية للأقراص أثناء تنقلها بين الأبراج. يمكن استخدام مكتبة
tkinterأوpygameلهذا الغرض. -
إظهار الحركات بشكل مختلف: يمكن تغيير كيفية عرض الحركات بشكل أكثر تنظيماً، مثل تمثيل الأبراج بشكل رسومي وتحديد مكان كل قرص على البرج في كل خطوة.
تطبيقات لغز أبراج هانوي
على الرغم من أن لغز أبراج هانوي هو لغز رياضي بحت، إلا أنه يملك تطبيقات عملية في مجالات عدة، مثل:
-
الذكاء الاصطناعي: يتم استخدام هذا اللغز في اختبار وتقييم قدرة الخوارزميات على التفكير المنطقي وحل المشكلات.
-
الدوال الاستدعائية (Recursion): يعد لغز أبراج هانوي مثالًا رائعًا لفهم كيفية عمل الاستدعاء الذاتي، وهو مفهوم أساسي في البرمجة.
-
التحليل الخوارزمي: يساعد حل اللغز في فهم طرق تحليل المشكلات الرياضية وتحديد مدى تعقيدها باستخدام تقنيات مثل تحليل التعقيد الزمني.
الخاتمة
يعد لغز أبراج هانوي من الألغاز الرياضية البسيطة التي يمكن أن تكون معقدة في نفس الوقت، حيث توفر فرصة لفهم كيفية تقسيم المهام الكبيرة إلى مهام أصغر باستخدام الاستدعاء الذاتي. من خلال استخدام بايثون، يمكن حل اللغز بشكل فعال وبسيط، مما يعزز قدرة المبرمجين على فهم المفاهيم الأساسية مثل الخوارزميات والاستدعاء الذاتي. إن تطبيق هذا اللغز في البرمجة يوفر فرصًا كبيرة للتعلم والنمو في مجال حل المشكلات البرمجية.

