我需要创建一个递归函数重复,该重复函数接受一个函数,并使用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 ^ 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
。
现在,如果基本案例是when 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
但是,正如电影制片人在评论中指出的那样,在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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句