Карринг и рекурсия - PullRequest
       1

Карринг и рекурсия

0 голосов
/ 04 сентября 2018

Мой вопрос тесно связан с вопросом здесь: Функция цепочки в Python , которая является «функцией добавления цепочки» в CodeWars. В ссылке много полезных решений, но я просто хочу выяснить, что не так с моим собственным решением.

Первое, что приходит мне в голову, - это использование карри, например

def add(a):
    def add2(b):
        return b + a
    return add2

add(1)(2)

даст мне 3 в качестве вывода.

Теперь я хочу добавить рекурсию, чтобы add(1), add(1)(2)(3), add(1)(2)(3)(4) и т. Д. Также могли работать должным образом:

def add(a):
    if not callable(a):
        return a
    else:
        def add2(b):
            return b + add(a)
        return add2

На этот раз add(1) возвращает 1, как и ожидалось, но add(1)(2), add(1)(2)(3) и т. Д. Выдает ошибку:

TypeError: 'int' object is not callable

Кто-нибудь может указать, что здесь не так? Кроме того, как решить это? Большое спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

@ MSeifert прав, на самом деле должен быть дубликатом, но, как вы можете сделать:

class myint(int):
    def __call__(self, i):
        return myint(self + i)
def add(v):
    return myint(v)

Сейчас:

>>> add(1)(2)
3
>>> add(1)(2)(3)
6

Или однострочник:

class add(int):__call__ = lambda self, v: add(self+v)

Или другой однострочный:

add = lambda v: type("", (int,), {"__call__": lambda self, v: self.__class__(self + v)})(v)

Каждый из них выводит:

>>> add(1)(2)
3
>>> add(1)(2)(3)
6
0 голосов
/ 04 сентября 2018

Кто-нибудь может указать, что здесь не так?

Когда вы вызываете его с помощью add(1), тогда a равен 1 (поэтому не вызывается), и он возвращает 1. Следующий шаг: у вас будет 1(2), но из-за того, что 1 не вызывается, это не удастся.

Кроме того, как решить это?

Вы не можете, потому что вам нужно знать, когда закончить рекурсию, но вы знаете только, если вам нужно перейти на уровень глубже после , когда вы полностью завершили текущий шаг. Поэтому, к сожалению, выбранный вами подход не будет работать, и вам придется искать другой подход. Вот тут и появляется ваша ссылка на вопрос о цепочке функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...