咖喱和递归

2024-04-26 07:19:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我的问题与这里的问题密切相关: Function chaining in 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

有人能指出这里出了什么问题吗?再者,如何解决?非常感谢你的帮助!你知道吗


Tags: 函数inaddreturnif链接defnot
2条回答

@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

Can anyone point out what's wrong here?

当您用add(1)调用它时,a就是1(因此不可调用),它将返回1。下一步:您将有1(2),但由于1不是可调用的,因此失败。你知道吗

Furthermore, how to resolve it?

你不能,因为你需要知道什么时候结束递归,但是你只知道在你完成当前步骤之后,你是否需要更深一层。所以不幸的是,你选择的方法将不起作用,你必须寻找一个不同的方法。那就是你的link to the question about function chaining comes in.

相关问题 更多 >