我需要创建一个递归函数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 ^ 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))
这显然不会起作用,因为递归会永远持续下去。但我不知道我应该如何编写这段代码,因为我首先需要计算3 ^ 2才能进行下一步9 ^ 2,依此类推。
答案 0 :(得分:4)
首先,您的基本情况有误:
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
然而,正如影片评论员在评论中指出的那样,在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)
答案 1 :(得分:-1)
您可以根据旧的重复功能简单地定义:
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))