下面是一个高阶函数
def fn(f, n):
def fn_inside(x):
for i in range(n):
x = f(x)
return x
return fn_inside
可以通过以下方式替换为recursion+lambdas
def fn(f, n):
return f if n == 1 else lambda y: fn(f, n-1)(f(y))
这两个函数在这种情况下工作得很好
sin(1)= 0.587181
from math import sin
f1 = fn(lambda x: "sin(%s)" % x, 5)
f2 = fn(lambda x: sin(x), 5)
print("%s = %f" % (f1("1"), f2(1)))
但是第二个函数在这里不起作用
print(fn(lambda x: sin(x), 0)(1000))
带错误
[Previous line repeated 995 more times]
RecursionError: maximum recursion depth exceeded in comparison
尝试增加我添加的递归限制
import sys
sys.setrecursionlimit(1500)
但是没有任何错误的改变。可能是负无穷大的问题。
附注:此函数不仅适用于正弦函数。所以你不需要为递归正弦优化它。这里可能有一个简单的解决方案吗?
发布于 2021-08-23 21:58:16
递归版本不能正确处理n < 1
。当这种情况发生时,它会无限递归,因为基例n == 1
永远不会到达。
当为n <= 0
时,迭代版本只返回x
,因为循环从不运行(range(0)
是一个空范围)。因此,您需要将该案例添加到递归版本中。
def fn(f, n):
if n < 1:
return lambda y: y
elif n == 1:
return f
else:
return lambda y: fn(f, n-1)(f(y))
https://stackoverflow.com/questions/68899423
复制相似问题