هل سبق لك الوقوع في دائرة تبدو وكأنها لا تنتهي حيث تستمر المشكلة في التفرع إلى أجزاء أصغر؟
إذا كان الأمر كذلك ، فربما تكون قد جئت إلى عالم آسر من العودية. في حين أنه قد يبدو من الصعب فهمه ، لا تقلق! في هذا المنشور ، سننطلق في رحلة ممتعة للتعرف على أنواع العودية.
لذا اربط حزام الأمان بينما نستكشف العديد من الأساليب العودية. استعد للدخول إلى عالم التكرار الرائع ولاحظ قدرته الرائعة في حل المشكلات المعقدة.
ما هي عمليات التكرار بالضبط؟
بكلمات أساسية ، العودية هي تقنية برمجة قوية تتضمن وظيفة تستدعي نفسها أثناء التنفيذ. إنه مثل التحديق في المرآة ورؤية صورة داخل صورة ، مما ينتج عنه دورة مرجعية ذاتية.
يمكننا معالجة المشكلات الكبيرة باستخدام العودية عن طريق تقسيمها إلى مشكلات فرعية أصغر وأكثر قابلية للإدارة.
إنه مشابه لتجميع بانوراما ، حيث ترتبط قطعة واحدة بأجزاء أخرى لإنتاج صورة كاملة. يتيح لنا التكرار حل المشكلات بطريقة أنيقة وفعالة من خلال تكرار نفس مجموعة التعليمات بمدخلات مختلفة.
1-العودية المباشرة
العودية المباشرة هي أبسط أنواع العودية ، حيث تستدعي الدالة نفسها مباشرة. يستلزم تقسيم المشكلة الإشكالية إلى مشكلات فرعية أصغر حتى يتم الوصول إلى حالة أساسية ، مما يؤدي إلى الإنهاء.
تستدعي الوظيفة العودية نفسها بمدخلات مختلفة ، مما يتيح تكرار تنفيذ نفس مجموعة التعليمات. يبني كل استدعاء على الحالة السابقة ، ويقترب تدريجياً من الحالة الأساسية التي تؤدي إلى إنهاء العودية.
دعنا نتحقق من هذا المثال.
def countdown(n):
if n <= 0:
return
print(n)
countdown(n - 1)
countdown(5)
الإخراج:
5
4
3
2
1
2-العودية غير المباشرة
تضيف العودية غير المباشرة تطورًا مثيرًا للاهتمام إلى المسار العودي. على عكس العودية المباشرة ، التي تتضمن وظيفة تستدعي نفسها صراحة ، فإن العودية غير المباشرة تتضمن سلسلة من استدعاءات الوظائف.
تستدعي إحدى الوظائف الأخرى ، والتي يمكنها بعد ذلك استدعاء الوظيفة الأصلية أو أي وظيفة أخرى تعود أخيرًا إلى الأصل. تنتج هذه الشبكة المترابطة من استدعاءات الوظائف رقصة آسرة تتعاون فيها العديد من الوظائف لإصلاح مشكلة ما.
على سبيل المثال:
def function_A(n):
if n > 0:
print("A:", n)
function_B(n - 1)
def function_B(n):
if n > 0:
print("B:", n)
function_A(n - 1)
function_A(3)
الإخراج:
A: 3
B: 2
A: 1
3-العودية الخطية
فكر في رحلة في طريق مستقيم ، خطوة بخطوة ، حتى تصل إلى هدفك. يتم تجسيد هذه التقنية التسلسلية من خلال العودية الخطية ، حيث تؤدي الوظيفة استدعاء تكراري واحد في كل عملية تكرار للوظيفة.
مع كل مكالمة متكررة ، تقترب العملية العودية من الحالة الأساسية عن طريق تقليل حجم المشكلة. يتم المضي قدمًا بطريقة واضحة وخطية ، حيث يتم حل المشكلات الفرعية واحدة تلو الأخرى حتى يتم الوصول إلى الإجابة النهائية.
على سبيل المثال:
def factorial(n):
if n == 0:
return 1
return n * factorial(n - 1)
result = factorial(5)
print(result)
الإخراج:
120
4-الشجرة العودية
عندما تتفرع دالة ما إلى عدة استدعاءات متكررة ، فإننا ندخل عالم التكرار الشجري. تُنشئ وظيفة في العودية الشجرية العديد من الاستدعاءات المتكررة ، كل منها يحل مشكلة فرعية منفصلة ، تمامًا كما تفعل فروع الشجرة.
يسمح هذا الهيكل المتفرّع بالتحقيق المتزامن في العديد من المسارات ، مما يؤدي إلى تقسيم المشكلات المعقدة بشكل فعال إلى مكونات أصغر مترابطة.
على سبيل المثال:
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
result = fibonacci(6)
print(result)
الإخراج:
8
5-العودية متداخلة
تضيف العودية المتداخلة درجة مثيرة من التعقيد إلى الكون العودي. في هذا الشكل من أشكال العودية ، تدمج الدالة استدعاء متكرر كوسيطة داخل مكالمة عودية أخرى.
يعمل النداء العودي الداخلي على قيمة تعتمد على المكالمة العودية الخارجية. يزداد التعقيد مع كل استدعاء متداخل ، ويبلغ ذروته في نمط مثير للاهتمام من الاستدعاءات المتكررة المتداخلة.
على سبيل المثال:
def nested_recursion(n):
if n > 100:
return n - 10
return nested_recursion(nested_recursion(n + 11))
result = nested_recursion(95)
print(result)
النتيجة:
91
6-عودة الذيل
العودية الخلفية هي تقنية تحسين للخوارزميات العودية التي يمكنها تحسين أدائها. يظهر النداء المتكرر كإجراء نهائي لدالة مع تكرار الذيل ، مما يجعل.
نظرًا لعدم وجود عمليات معلقة بعد الاستدعاء المتكرر ، يمكن للمترجم أو المترجم الفوري تبسيط العودية عن طريق استبدالها بقفزة بسيطة.
أسلوب التحسين هذا ، المعروف باسم تحسين الاتصال الذيل ، يقلل من متطلبات كل مكالمة متكررة للاحتفاظ بإطار مكدس ، مما يؤدي إلى زيادة السرعة وتقليل استخدام الذاكرة.
على سبيل المثال:
def tail_factorial(n, result=1):
if n == 0:
return result
return tail_factorial(n - 1, result * n)
result = tail_factorial(5)
print(result)
اخرج:
120
7-عدم عودة الذيل
على عكس العودية الخلفية ، تتضمن العودية غير الذيلية أنشطة إضافية يتم إجراؤها بعد المكالمة العودية داخل وظيفة. قبل أن يتم تنفيذ أي إجراءات أخرى ، يجب أن تكتمل كل مكالمة متكررة وتعود.
نتيجة لذلك ، حتى يتم الوصول إلى الحالة الأساسية وينتهي العودية ، يتم الاحتفاظ بمكدس من العمليات المعلقة. غالبًا ما يستخدم التكرار غير الذيل مزيدًا من الذاكرة وهو أقل كفاءة من تكرار الذيل ، ولكنه لا يزال أداة مفيدة لمعالجة مجموعة متنوعة من المشكلات.
على سبيل المثال:
def non_tail_sum(n):
if n == 0:
return 0
return n + non_tail_sum(n - 1)
result = non_tail_sum(5)
print(result)
الإخراج:
15
يتم إحتوائه
العودية مفهوم مثير للاهتمام في البرمجة. يسمح لنا بمعالجة المشاكل المعقدة بطريقة عودية ذات مرجعية ذاتية.
إنه يوفر طريقة متميزة في التفكير في المشكلات وحلها ، وتقسيمها إلى أجزاء أصغر يسهل التحكم فيها. ومع ذلك ، عند العمل مع العودية ، من الأهمية بمكان استخدام الانتباه إلى بعض النقاط.
يجب عليك تحديد الحالات الأساسية المناسبة التي تسمح بإنهاء العودية. إذا لم تكن موجودة ، فقد تستمر الوظيفة في استدعاء نفسها إلى الأبد.
ثانيًا ، استنادًا إلى السيناريو المطروح ، يمكن أن يؤدي اختيار النوع المناسب من التكرار إلى حلول أكثر كفاءة وأناقة. حاول أن تجد أفضل حل للمشكلة في متناول اليد. عند العمل بأعماق عودية شاسعة ، كن على دراية بالمخاطر المحتملة مثل تجاوز المكدس.
اترك تعليق