Python 中的重复函数
我在学习Python中的高阶函数时遇到了困难。我需要写一个叫做repeat
的函数,这个函数可以把另一个函数f
在给定的参数x
上执行n
次。
举个例子,repeat(f, 3, x)
的意思就是f(f(f(x)))
,也就是把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
错误。我看过关于如何重复执行一个函数n次的内容,但我需要按照这种方式来实现,结果我还是搞不定……
2 个回答
2
你这里有个很简单的错误。在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
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
>>>