关于python:柯里化和递归

Currying and Recursion

我的问题与这里的问题密切相关:
Python中的函数链
,也就是 CodeWars 上的"加链函数"问题。
链接中有很多有用的解决方案,但我只是想找出我自己的解决方案有什么问题。

首先想到的是使用柯里化,例如

1
2
3
4
5
6
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) 等也可以按预期工作:

1
2
3
4
5
6
7
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) 等给我错误:

1
TypeError: 'int' object is not callable

谁能指出这里有什么问题?此外,如何解决?非常感谢您的帮助!


Can anyone point out what's wrong here?

当你用 add(1) 调用它时,a1(所以不可调用),它将返回 1。下一步:您将拥有 1(2) 但由于 1 不是可调用的,因此失败。

Furthermore, how to resolve it?

你不能,因为你需要知道什么时候结束递归,但你只知道在你完全完成当前步骤之后是否需要更深一层。所以不幸的是,您选择的方法不起作用,您必须寻找不同的方法。这就是您链接到有关函数链接的问题的地方。


@MSeifert 是对的,实际上应该是重复的,但你可以这样做:

1
2
3
4
5
class myint(int):
    def __call__(self, i):
        return myint(self + i)
def add(v):
    return myint(v)

现在:

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

或单线:

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

或者另一个单行:

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

每一个输出:

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