Python 使用lambda表达式的递归函数
我需要创建一个递归函数repeat,它接受一个函数并使用函数n次,值为x。这里有一个迭代版本,它更详细地解释了我的问题Python 使用lambda表达式的递归函数,python,recursion,lambda,Python,Recursion,Lambda,我需要创建一个递归函数repeat,它接受一个函数并使用函数n次,值为x。这里有一个迭代版本,它更详细地解释了我的问题 def repeat(fn, n, x): res = x for i in range(n): res = fn(res) print(res) return res print(repeat(lambda x: x**2, 3, 3)) returns 6561 首先是3^2,然后是3^2^2,即81,然后是3^2
def repeat(fn, n, x):
res = x
for i in range(n):
res = fn(res)
print(res)
return res
print(repeat(lambda x: x**2, 3, 3)) returns 6561
首先是3^2,然后是3^2^2,即81,然后是3^2^2^2=6561。
我如何使它递归,使它可以像这样工作
square_three_times = repeat(lambda x: x**2, 3)
print(square_three_times(3)) return 6561
我尝试过这样的事情,但我真的迷路了,不知道该怎么办
def repeat(fn, n):
if n == 1:
return fn(n):
else:
def result(x):
return fn(n)
return repeat(fn,result(x))
这显然是行不通的,因为递归将永远持续下去。但我不确定该如何编写这段代码,因为在执行下一步9^2之前,我首先需要计算3^2,依此类推。首先,基本情况是错误的:
if n == 1:
return fn
毕竟,repeat(fn,1)
只是一个应用fn
一次即fn
的函数
现在,如果基本情况是当n==1
时,递归情况几乎总是将n-1
传递给自己
那么,repeat(fn,n)
和repeat(fn,n-1)
之间有什么区别呢?如果你想不出来,在你的头脑中或纸上展开一个简单的例子:
repeat(fn, 3)(x): fn(fn(fn(x)))
repeat(fn, 2)(x): fn(fn(x))
现在很明显:repeat(fn,n)
和fn(repeat(fn,n-1))
是一样的,对吗?因此:
else:
def new_fn(x):
return fn(repeat(fn, n-1)(x))
return new_fn
然而,正如filmor在评论中指出的,在这里使用
partial
更容易:
def repeat3(fn, n, x):
if n == 1:
return fn(x)
else:
return fn(repeat3(fn, n-1, x))
def repeat(fn, n):
return functools.partial(repeat3, fn, n)
您可以根据旧的repeat函数非常简单地定义它:
repeat_new = lambda fn, n: lambda x: repeat(fn, n, x)
square_three_times = repeat_new (lambda x: x**2, 3)
print(square_three_times(3))
您需要让它递归,还是需要它像那样工作?递归不必涉及。我需要它是递归的。你为什么不为递归变量使用
x
参数?如果你想要一个只实现重复的函数repeat(fn,n,x)
并使用functools.partial
实现currying。请注意,在Python 3.3中,您问题中给出的示例返回81。感谢我尝试使用您的第一个示例,但返回fn时语法无效,我编辑了我的原始帖子。编辑:没关系,我发现了我愚蠢的失误。是的,但那不是递归的,他的问题的关键是如何递归地做。(另外,这只是一种更为详细的编写partial
)@abarnert:functool.partial
只会给你一种程度的偏爱,不是吗?用partial
把f(x,y,z)
转换成g(x)(y)(z)
,而不是使用g=lambda x:lambda y:lambda z:f(x,y,z)有什么简单的方法吗
这就像说lambda
只允许您显式地编写一个级别的偏好…您始终可以在partial
上调用partial
。