我有一个函数,可以做一些计算,g(x)。我现在想编写一个计算g(g(g(... g(x))))的函数,其中g被应用了n次。我尝试使用repeat_fn
(请参见下文)执行此操作,但这不起作用。
根据使用lambda表达式的递归函数,解决方案是使用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) )
,您所调用repeat_fn
的f
参数是的结果f(y)
,即不是函数。相反,您应该传递just 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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句