كل ما تحتاج لمعرفته حول Recursion In Python



ستساعدك هذه المقالة في الحصول على معرفة مفصلة وشاملة حول العودية في بايثون. كيف تعمل؟ وما هو الغرض منه؟

بكلمات بسيطة ، العودية هي طريقة لحل المشكلة من خلال الحصول على وظيفة استدعاء نفسها ، الكلمة ' العودية 'ينشأ من الفعل اللاتيني' تتكرر '، وهو ما يعني إعادة شيء ما. هذا ما تفعله الوظيفة العودية ، فهي تعيد نفس الشيء مرارًا وتكرارًا ، أي أنها تستدعي نفسها. في هذه المقالة ، سوف نتعرف على العودية في بيثون. فيما يلي المواضيع التي تم تناولها في هذه المدونة:

ما هو العودية في بايثون؟

العودية هي عملية تحديد شيء ما في حد ذاته. نحن نعلم أنه في بايثون ، يمكن لأي دالة استدعاء أي وظيفة أخرى ، ويمكن للدالة أيضًا استدعاء نفسها. تسمى هذه الأنواع من الوظائف التي تستدعي نفسها حتى لا يتم استيفاء شرط معين بالوظائف العودية.





Recursion-in-Python

دعنا نأخذ بعض الأمثلة لنرى كيف يعمل ذلك ، إذا أعطيت عددًا صحيحًا موجبًا n فسيكون العامل.



  • ن! = n * (n-1) * (n-2) وهكذا.
  • 2! = 2 * (2-1)
  • واحد! = 1
  • 0! = 0
  • 4! = 4 * 3!
  • 3! = 3 * 2!
  • 2! = 2 * 1!

سيؤدي استبدال القيم أعلاه إلى التعبير التالي

  • 4! = 4 * 3 * 2 * 1

علينا أن نحدد دالة ، دعنا نقول حقيقة (n) التي تأخذ عددًا صحيحًا موجبًا أو 0 كمعامل لها وتعيد العامل رقم n ، كيف يمكننا القيام بذلك باستخدام العودية؟

الحصول على حجم مصفوفة جافا سكريبت

دعونا نرى ، للقيام بذلك باستخدام العودية ، نحتاج إلى فحص المعادلة التالية



  • ن! = ن. (ن -1). (ن -2) & هيلب 3.2.1

  • ن! = ن. (ن -1)! # يمكننا إعادة كتابة البيان أعلاه كما في هذا السطر

  • الآن هنا إذا مررنا 2 كمعامل فسنحصل على:

    • 2! = 2.1! = 2

  • وبالمثل ، إذا تجاوزنا 1 ، فسنحصل على:

    • واحد! = 1.0! = 1

  • ولكن إذا تجاوزنا 0 ، فإنه ينكسر

    • 0! = 0. (- 1)! وهنا لم يتم تعريف مضروب لـ -1 ، لذلك يعمل هذا فقط مع القيم> 0

  • لذلك علينا كتابة حالتين

    • 1. ن! = ن. (ن -1)! إذا كانت n> = 1

    • 2. 1 إذا كان n = 0

هذا هو الحل الكامل لجميع الأعداد الصحيحة الموجبة و 0.

أخيرًا وضع اللمسات الأخيرة في جافا

شرط الإنهاء

يجب أن تفي الوظيفة العودية بشرط مهم للإنهاء. بالانتقال إلى حالة يمكن فيها حل المشكلة دون مزيد من التكرار ، ستنتهي الدالة العودية ، مما يقلل المشكلة إلى خطوات فرعية أصغر. يمكن أن ينتهي الأمر بالعودة في حلقة لا نهائية إذا لم يتم استيفاء شرط الإنهاء في المكالمات.

شروط عاملية:

  • مضروب n = n * (n-1) طالما أن n أكبر من 1.
  • 1 إذا كان n = 0

سنقوم بتحويل شروط العوامل المذكورة أعلاه في كود بيثون:

حقيقة def (n): إذا كان n == 1: إرجاع n else: إرجاع n * حقيقة (n-1)

لنأخذ مثالاً ، لنفترض أننا نريد إيجاد العامل 4:

حقيقة (4) # هذا سيعيد 4 * حقيقة (3) وهكذا حتى ن == 1.
 انتاج: 24

يتم استخدامه كثيرًا كمثال للتكرار نظرًا لبساطته ووضوحه. حل الحالات الصغيرة لمشكلة ما في كل خطوة يطلق عليها العودية في علوم الكمبيوتر.

حد التكرار في Python

في بعض اللغات ، يمكنك إنشاء حلقة عودية لا نهائية ، ولكن في بايثون ، يوجد حد للتكرار. للتحقق من الحد ، قم بتشغيل الوظيفة التالية من وحدة sys. والتي ستعطي حد مجموعة العودية للبيثون.

استيراد sys sys.getrecursionlimit ()
 انتاج: 1000

يمكنك أيضًا تغيير الحد باستخدام وظائف وحدة النظام sysetrecursionlimit () وفقًا لمتطلباتك ، فلنقم الآن بإنشاء وظيفة تستدعي نفسها بشكل متكرر حتى تتجاوز الحد وتتحقق مما يحدث:

كيفية إنشاء الحزمة في جافا
def recursive (): العودية () if __name__ == '__main__': العودية ()

إذا قمت بتشغيل الكود أعلاه ، فستحصل على استثناء وقت التشغيل: RuntimeError: تم تجاوز الحد الأقصى لعمق العودية. تمنعك Python من إنشاء دالة تنتهي بحلقة عودية لا تنتهي أبدًا.

تسطيح القوائم مع العودية

أشياء أخرى يمكنك القيام بها باستخدام العودية باستثناء العوامل ، دعنا نقول أنك تريد إنشاء واحدة من قائمة متداخلة ، ويمكن القيام بذلك باستخدام الكود أدناه:

def flatten (a_list، flat_list = لا شيء): إذا كانت flat_list لا شيء: flat_list = [] للعنصر في a_list: إذا كان (عنصر ، قائمة): flatten (item، flat_list) وإلا: flat_list.append (عنصر) إرجاع قائمة مسطحة إذا __name__ == '__main__': nested = [1،2،3، [4،5]، 6] x = flatten (nested) print (x)
 انتاج: [1،2،3،4،5،6]

سيؤدي تشغيل الكود أعلاه إلى قائمة واحدة بدلاً من قائمة أعداد صحيحة تحتوي على قائمة أعداد صحيحة استخدمناها كمدخلات. يمكنك أيضًا أن تفعل الشيء نفسه باستخدام طرق أخرى أيضًا ، لدى Python شيء يسمى itertools.chain () يمكنك التحقق من الكود المستخدم لإنشاء سلسلة دالة () إنها طريقة مختلفة للقيام بنفس الشيء كما فعلنا.

مزايا العودية

  • الشفرة نظيفة وأنيقة في وظيفة تكرارية.

  • يمكن تقسيم المهمة المركبة إلى مشاكل فرعية أبسط باستخدام العودية.

  • إنشاء تسلسل أسهل مع العودية من استخدام بعض التكرار المتداخلة.

مساوئ العودية

  • قد يكون اتباع المنطق وراء الدالة العودية صعبًا في بعض الأحيان.

  • المكالمات المتكررة باهظة الثمن (غير فعالة) لأنها تستهلك الكثير من الذاكرة والوقت.

  • يصعب تصحيح الدوال التكرارية.

في هذه المقالة رأينا ما هو العودية وكيف يمكننا تطوير الدوال العودية من بيان المشكلة ، وكيف يمكن رياضيًا تعريف بيان المشكلة. لقد حللنا مشكلة عاملية واكتشفنا الشروط المطلوبة للعثور على العوامل التي تمكنا من خلالها من تحويل تلك الشروط إلى كود بيثون مما يمنحك فهمًا لكيفية عمل العودية. أعتقد أنه من الرائع أن تمتلك Python حدًا داخليًا للتكرار لمنع المطورين من إنشاء وظائف تكرارية سيئة الإنشاء. أحد الأشياء المهمة التي يجب ملاحظتها هو أنه من الصعب تصحيح أخطاء العودية حيث تستمر الوظيفة في استدعاء نفسها.