Python 咖喱和递归
我的问题与这里的问题密切相关: ,这是CodeWars上的“链添加函数”问题。 链接中有很多有用的解决方案,但我只想找出我自己的解决方案有什么问题 例如,我想到的第一件事就是使用咖喱Python 咖喱和递归,python,functional-programming,Python,Functional Programming,我的问题与这里的问题密切相关: ,这是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):
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
有人能指出这里出了什么问题吗?此外,如何解决呢?非常感谢你的帮助
有人能指出这里出了什么问题吗
当您使用add(1)
调用它时,a
是1
(因此不可调用),它将返回1
。下一步:您将有1(2)
,但由于1
不是可调用的,因此此操作失败
此外,如何解决呢
您不能,因为您需要知道何时结束递归,但您只知道在完成当前步骤后是否需要更深一层。因此,不幸的是,您选择的方法将不起作用,您必须寻找不同的方法。这就是你的@MSeifert正确的地方,实际上应该是重复的,但正如你所能做的:
class myint(int):
def __call__(self, i):
return myint(self + i)
def add(v):
return myint(v)
现在:
或一行:
class add(int):__call__ = lambda self, v: add(self+v)
add = lambda v: type("", (int,), {"__call__": lambda self, v: self.__class__(self + v)})(v)
或另一个一行:
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
可能的副本是从副本中复制的吗(除了不同的变量名)?@MSeifert是的,但希望OP理解,但实际上是的,我认为我应该删除我的answer@MSeifert我这样做是因为OP看到了这个,但无法嵌入它(我不知道为什么?@U9转发感谢您的回答,在问我自己的问题之前,我已经看完了所有相关问题的解决方案。这些解决方案没有解决我的问题,所以我问了一个新的。