首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用recursion+lambdas重写高阶函数

使用recursion+lambdas重写高阶函数
EN

Stack Overflow用户
提问于 2021-08-23 21:53:27
回答 1查看 45关注 0票数 1

下面是一个高阶函数

代码语言:javascript
运行
复制
def fn(f, n):
    def fn_inside(x):
        for i in range(n):
            x = f(x)
        return x
    return fn_inside

可以通过以下方式替换为recursion+lambdas

代码语言:javascript
运行
复制
def fn(f, n):
    return f if n == 1 else lambda y: fn(f, n-1)(f(y))

这两个函数在这种情况下工作得很好

sin(1)= 0.587181

代码语言:javascript
运行
复制
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)))

但是第二个函数在这里不起作用

代码语言:javascript
运行
复制
print(fn(lambda x: sin(x), 0)(1000))

带错误

代码语言:javascript
运行
复制
[Previous line repeated 995 more times]
RecursionError: maximum recursion depth exceeded in comparison

尝试增加我添加的递归限制

代码语言:javascript
运行
复制
import sys
sys.setrecursionlimit(1500)

但是没有任何错误的改变。可能是负无穷大的问题。

附注:此函数不仅适用于正弦函数。所以你不需要为递归正弦优化它。这里可能有一个简单的解决方案吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-23 21:58:16

递归版本不能正确处理n < 1。当这种情况发生时,它会无限递归,因为基例n == 1永远不会到达。

当为n <= 0时,迭代版本只返回x,因为循环从不运行(range(0)是一个空范围)。因此,您需要将该案例添加到递归版本中。

代码语言:javascript
运行
复制
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))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68899423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档