سؤال

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

المشكلة هي أن الكود الذي أفكر فيه ، والتعامل معه ، لا يستخدم نفس الوظيفة! يستخدم نفس الشيء الشفرة في وظيفة أخرى (كطريقة أو إغلاق).

المشكلة هنا هي أنه على الرغم من أن الكود الخاص بي هو نفسه ، فإن الوظائف ليست كذلك. ألقِ نظرة على مثال العودية المتبادلة الأساسية التالية:

def is_even(x):
    if x == 0:
        return True
    else:
        return is_odd(x - 1)

def is_odd(x):
    if x == 0:
        return False
    else:
        return is_even(x - 1)

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

def make_is_even(): 
    def is_even(x):
        if x == 0:
            return True
        else:
           return make_is_odd()(x - 1)
    return is_even

def make_is_odd(): 
    def is_odd(x):
        if x == 0:
            return False
        else:
            return make_is_even()(x - 1)
    return is_odd

def is_even2(x):
    return make_is_even()(x)

def is_odd2(x):
    return make_is_odd()(x)

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

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

class EvenChecker(object):
    def check(self, x):
        if x == 0:
            return True
        else:
            return OddChecker().check(x - 1)

class OddChecker(object):
    def check(self, x):
        if x == 0:
            return False
        else:
            return EvenChecker().check(x - 1)

def is_even3(x):
    return EvenChecker().check(x)

def is_odd3(x):
    return OddChecker().check(x)

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

هل كانت مفيدة؟

المحلول

كما تشير ، هذا لا يزال عودة متبادلة. لا أعتقد أن "شيء أكثر" تسأل عنه له اسم ؛ إذا لم أسمع ذلك من قبل.

نصائح أخرى

العودة المتبادلة هي مجرد حالة خاصة عودة غير مباشرة.

على ما يبدو ، يطلق عليه عودة متبادلة :)

حتى أن المقالة تعطي نفس المثال مثلك odd? و even? المهام.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top