Вопрос

Моя проблема с определенным стилем кода, который очень напоминает рекурсию, но не довольно это. Рекурсия есть, чтобы цитировать Википедия, «Способ определения функций, в которых определена функция, применяется в его собственном определении». Точно так же взаимная рекурсия применяется другая функция, которая, прямо или косвенно применяет функцию, которую мы определяем.

Проблема в том, что код, о котором я думаю, и дело, не использует ту же функцию! Он использует то же самое код в другой функции (как метод или закрытие).

Проблема вот что, пока мой код одинаково, функции нет. Посмотрите следующий основной пример взаимной рекурсии:

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)

На этот раз цепь является созданием объекта и вызовы методов, но принцип одинаков. (Я бы на самом деле отметил, что немного по-другому, в том, что Python определяет простую обертку на основании на основе на объект, которая сама вызывает ту же функцию каждый раз - но это не обязательно что-то, что нам нужно знать, и это не должны быть правдой для других реализаций классов и объектов. Но да, строго говоря является взаимно рекурсивный, а также ... что-то большее, и это то, что я хочу знать.)

Это было полезно?

Решение

Как вы указываете, это все еще взаимная рекурсия. Я не думаю, что «что-то большее» вы спрашиваете о том, что есть имя; Если это, я никогда не слышал это.

Другие советы

Взаимная рекурсия - это просто особый случай косвенная рекурсия.

Видимо, это называется Взаимная рекурсия :)

Статья даже дает тот же пример, что и вы, с odd? а также even? Функции.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top