我有一个函数可以做一些计算,g(x)。我现在想编写一个函数来计算 g(g(g(...g(x)))),其中 g 被应用了 n 次。我尝试使用 repeat_fn
(见下文)来执行此操作,但这不起作用。
根据 Recursive function using lambda expression解决方案是使用 functools.partial。这确实有效,但我不明白如何。另外,我不明白为什么我的方法不起作用。
g = lambda x: 2*x
# Function that returns the fˆn map
def repeat_fn(f, n):
if n == 1:
return f
else:
return lambda y: f( repeat_fn(f(y), n-1) )
def repeat_fn_base(fn, n, x):
if n == 1:
return fn(x)
else:
return fn(repeat_fn_base(fn, n-1, x))
def repeat_fn2(fn, n):
return functools.partial(repeat_fn_base, fn, n)
j = repeat_fn2(g, 5)
print(type(j))
print(j(2))
k = repeat_fn(g, 5)
print(type(k))
print(k(2))
看起来 repeat_fn
在我使用 k = repeat_fn(g, 5)
时只被调用一次,而我预计它会被调用五次。显然,在我为 k 提供参数之前,递归不会开始。此外 print(k(2))
给出以下错误:TypeError: unsupported operand type(s) for *: 'int' and 'function'
。
这让我感到惊讶,因为例如h = g(g(x)
工作得很好。
任何人都可以阐明这一点吗?谢谢!
最佳答案
使用 return lambda y: f( repeat_fn(f(y), n-1) )
,您将使用 f
调用 repeat_fn
> 参数是 f(y)
的结果,即 不是 函数。相反,您应该只传递 f
,然后将 fn_repeat
(一个函数)的结果应用到 f(y)
(反之亦然)。
def repeat_fn(f, n):
if n == 1:
return f
else:
return lambda y: repeat_fn(f, n-1)(f(y))
k = repeat_fn(lambda x: 2*x, 5)
print(k(2)) # 64
关于python - 使用 lambda 的递归函数,为什么这不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48687138/