الفصل 12

الفصل 12

12.1 أساسيات العَودية

1.
a. تتم حركة الحلقة الأصغر، وهي مشكلة أصغر، مرتين في طريق حل مشكلة الحلقتين ككل. يتم تقسيم مهمة تحريك الحلقات الثلاث كلها إلى مهام أصغر تتمثل في تحريك حلقة واحدة في كل مرة.
2.
b. يُستخدم حل الحلقتين من السؤال 1 في حل مشكلة الحلقات الثلاث.
3.
b. مرة واحدة لتحريك حلقتين إلى البرج الأوسط باتباع القواعد، ثم لتحريك حلقتين إلى البرج الهدف.
4.
c. تُحرَّك الحلقة الصغيرة إلى البرج الأوسط. وتُحرَّك الحلقة الأكبر إلى البرج الهدف. ثم تُحرَّك الحلقة الصغيرة من البرج الأوسط إلى البرج الهدف.
5.
c. لحل المشكلة، يُستخدم حل الحلقتين مرتين، وهناك خطوة إضافية واحدة لتحريك الحلقة الأكبر من المصدر إلى الهدف. يتطلب كل حل لحلقتين ثلاث خطوات. لذا 3 + 1 + 3 = 7 خطوات إجمالاً.
6.
a. تستخدم مشكلة الحلقات الأربع حل الحلقات الثلاث مرتين. تُحرَّك الحلقات الثلاث الأصغر إلى البرج الأوسط، وتستغرق سبع خطوات كما في السؤال 2. هناك حاجة لخطوة واحدة لتحريك الحلقة الأكبر من المصدر إلى الهدف. ويستغرق الأمر سبع خطوات أخرى لتحريك الحلقات الثلاث الأصغر من البرج الأوسط إلى البرج الهدف. الإجمالي هو 7 + 1 + 7 = 15 خطوة.

12.2 العَودية الرياضية البسيطة

1.
يمكن حساب المجموع باستخدام العَودية لوجود نمط منتظم، ويعتمد المجموع حتى n على المجموع حتى n - 1.
2.
يمكن إيجاد كل عدد في المتتالية بإضافة 2 إلى العدد السابق، حيث يكون الحل عند 1 هو 1 .
3.
لا يعتمد العدد الأولي على عدد أولي أصغر منه؛ وبالتالي، لا يمكن إيجاد عَودية لتوليد أعداد أولية جديدة بناءً على قائمة موجودة من الأعداد الأولية.
4.
يتم إيجاد عدد معين في متتالية فيبوناتشي بجمع العددين السابقين في المتتالية، لذا يمكن إيجاد متتالية فيبوناتشي بشكل عَودي.
5.
c. هناك حالة أساسية مفقودة، لذا لا يوجد مكان تنتهي فيه العَودية.
6.
b. يستخدم هذا التعريف للدالّة rec_fact() حالة أساسية هي n == 0، وهذا يعمل لأن 0! = 1 تمامًا مثل 1!. ومع ذلك، فإن الحالة الأساسية n == 0 تُرجع n، والتي تكون في هذه المرحلة 0 ، وبالتالي تُصفّر بقية الحساب.
7.
a. تبدأ الدالّة العَودية بالإرجاع بشكل صحيح عند الحالة الأساسية n == 0. 0! = 1.
8.
b. لا تُستخدم الحالة الأساسية n == 1 في الدالّة. عندما تكون n هي 0 ، يصبح الضرب الكلي 0 . تبدأ العَودية بالإرجاع بمجرد الوصول إلى الحالة الأساسية n < 0، حيث يُرجع في البداية -1. لكن الاستدعاء العَودي السابق سيعيد 0 ، وبالتالي يُصفّر جميع العمليات الحسابية ويترك نتيجة إجمالية قدرها 0 .

12.3 العَودية مع السلاسل النصية والقوائم

1.
b. بمجرد تحويلها إلى أحرف صغيرة، تكون كلمة "madam" متناظرة، لذا ستتعرف الدالّة على الكلمة كمتناظرة.
2.
a. عندما تحتوي الكلمة المتناظرة على عدد زوجي من الأحرف، تتبقى في النهاية سلسلة نصية فارغة مع إزالة أزواج الأحرف. وبالتالي، يجب أن تتضمن الحالة الأساسية len(word) == 0، والتي تُحل بالشرط len(word) <= 1.
3.
b. تزيل دالّة strip() حرفًا معينًا من بداية ونهاية السلسلة النصية، بما في ذلك الأحرف المتكررة. عند استخدام strip('m') مع "madamm" ، تكون السلسلة النصية الناتجة هي "ada" .
4.
a. تحتوي كلتا القائمتين على نفس العناصر بترتيب مختلف.
5.
b. تحتوي القائمتان على أربعة عناصر متداخلة، لكن list_num تحتوي على 15 إضافية، وother_list تحتوي على 22 إضافية.
6.
a. تحتوي كلتا القائمتين على نفس العناصر بترتيب مختلف. تعمل الدالّة مع عناصر من أي نوع.
7.
a. تحتوي كلتا القائمتين على نفس العناصر بترتيب مختلف. تعمل الدالّة مع عناصر من أي نوع، بما في ذلك القوائم الأخرى.
8.
a. تحتوي كلتا القائمتين على نفس العناصر بنفس الترتيب.

12.4 مزيد من العَودية الرياضية

1.
c. fib(9) = fib(8) + fib(7). fib(9) = fib(8) + fib(7) = 21 + 13 = 34.
2.
c. هناك ثماني استدعاءات للحالات الأساسية كما هو موضح في الرسوم المتحركة. تؤدي هذه الاستدعاءات إلى إرجاع العَودية وحساب القيمة النهائية.
3.
b. يُطلق على الهيكل الذي يوضح استدعاءات الدوال شجرة العَودية. يمكن استخدام شجرة العَودية لتتبع كيفية حساب القيم النهائية.
4.
c. 5 * 3 = 15 و 5 * 7 = 35، لذا 5 هو القاسم المشترك الأكبر لـ 15 و 35 .
5.
a. ينتج عن الاستدعاء الأول gcd(24, 30) القيمة 30 - 24 = 6، لذا يكون الاستدعاء التالي هو gcd(24, 6). بعد ذلك، تكون الاستدعاءات الأخرى هي gcd(18, 6)، gcd(12, 6)، وgcd (6,6) بإجمالي أربعة استدعاءات عَودية بعد الاستدعاء الأول للدالّة.
6.
b. عندما لا يكون للعددين قواسم مشتركة، يكون القاسم المشترك الأكبر (GCD) هو 1.
7.
b. ينتج عن الاستدعاء الأول gcd(13, 23) القيمة 23 - 13 = 10، لذا يكون الاستدعاء التالي هو gcd(13, 10). بعد ذلك، تكون الاستدعاءات الأخرى هي gcd(10, 3)، gcd(7, 3)، gcd (4,3)، gcd(3,2)، gcd(2,1)، وgcd(1,1) بإجمالي ثمانية استدعاءات.

12.5 استخدام العَودية لحل المسائل

1.
c. هذه المصفوفة مرتبة ترتيبًا تصاعديًا، وهو ما يتطلبه استخدام خوارزمية البحث الثنائي.
2.
a. mid = (4 + 7) // 2 = 11 // 2 = 5. يُستخدم العامل // للقسمة الصحيحة.
3.
a. ينتج عن الاستدعاء الأول أن mid تكون 3 ، ثم تصبح mid 5 ، وأخيرًا تصبح mid 4 . العنصر الموجود في الفهرس 4 يساوي المفتاح 16 .
4.
a. ينتج عن الاستدعاء الأول أن mid تكون (0 + 13) // 2 = 6. الاستدعاء التالي يجعل mid (7 + 13) // 2 = 10. الاستدعاء الذي يليه يجعل mid (11 + 13) // 2 = 12. في هذه المرحلة، 86 < 99، ليصبح mid = 11، وبعدها لا تبقى أي نطاقات للفحص.
5.
b. كما هو موضح في مثال الشِفرة للحلقات الثلاث، يتطلب الحل سبع خطوات. تُستدعى الخطوات السبع مرتين، بالإضافة إلى خطوة إضافية واحدة، ليصبح المجموع 2 × 7 + 1 = 15.
6.
a. يتطلب الحل التكراري لمشكلة الأبراج الثلاثة شِفرة أكثر بكثير ويستخدم قدرات برمجية إضافية.