我在python中遇到了高阶函数。我需要编写一个重复函数repeat
,它将函数f
n
次应用于给定的参数x
。
例如,repeat(f, 3, x)
为f(f(f(x)))
。
这就是我所拥有的:
def repeat(f,n,x):
if n==0:
return f(x)
else:
return repeat(f,n-1,x)
当我尝试断言以下行时:
plus = lambda x,y: repeat(lambda z:z+1,x,y)
assert plus(2,2) == 4
它给了我一个AssertionError
。我读到了How to repeat a function n times,但我需要以这种方式完成它,我无法弄明白......
答案 0 :(得分:5)
你有两个问题:
n == 1
,则应调用该函数一次);和f
,因此该函数只应用一次。尝试:
def repeat(f, n, x):
if n == 1: # note 1, not 0
return f(x)
else:
return f(repeat(f, n-1, x)) # call f with returned value
或者,或者:
def repeat(f, n, x):
if n == 0:
return x # note x, not f(x)
else:
return f(repeat(f, n-1, x)) # call f with returned value
(感谢后者的@Kevin,它支持n == 0
)。
示例:
>>> repeat(lambda z: z + 1, 2, 2)
4
>>> assert repeat(lambda z: z * 2, 4, 3) == 3 * 2 * 2 * 2 * 2
>>>
答案 1 :(得分:1)
你在那里得到了一个非常简单的错误,在else块中你只是传递x而没有做任何事情。你也在n == 0时应用x,不要这样做。
def repeat(f,n,x):
"""
>>> repeat(lambda x: x+1, 2, 0)
2
"""
return repeat(f, n-1, f(x)) if n > 0 else x