当 Python 中的 Lambda 函数弯曲超过 1e5 次时,发生“分段错误”

'Segmentation Fault' occurred when Lambda Function in Python recurves over 1e5 times

提问人:nik_nul 提问时间:9/28/2023 最后编辑:nik_nul 更新时间:9/29/2023 访问量:55

问:

def count_cond(condition):
    return lambda x:(((lambda f:(lambda a:f(a(a)))(lambda a:f(lambda *w:a(a)(*w))))(lambda cc: lambda j,m: ((cc(j+1,m+1) if condition(x,m)==True else cc(j,m+1))) if m<=x else j))(0,1))
# Returns a function with one parameter N that counts all the numbers from 1 to N that satisfy the two-argument predicate function Condition, where the first argument for Condition is N and the second argument is the number from 1 to N.

我实现了上面的功能,按照说明所说的那样做。它可能有点抽象,所以下面的例子可能有助于你理解我实际上在做什么。

>>> count_factors = count_cond(lambda n, i: n % i == 0)
>>> count_factors(12)  # 1, 2, 3, 4, 6, 12
6
>>> count_factors(10000)
25

在小规模测试用例中,它运行良好。您可能会发现“超出最大递归深度”,然后您可以尝试以下几行进行快速修复,因为深度预计约为 2n。

import sys
sys.setrecursionlimit(10000000)

但是当涉及到更大的规模时,比如 1e6 或类似的东西(我的意思是),python 只会返回并崩溃,直接返回终端,如下图所示。分段故障图像count_factors(100000)Segmentation Fault

但是,如果我将该 lambda 函数扩展为正常函数,如下所示,效率可能有点低,但它仍然运行良好,即使在 1e7 测试中(它是)。count_factors(1000000)

def cc(condition,x,j=0,m=1):
    return ((cc(condition,x,j+1,m+1) if condition(x,m)==True else cc(condition,x,j,m+1))) if m<=x else j

我试图使用和python,但它们都没有提供任何有价值的东西。他们只是向程序展示了一次又一次地重复那行,直到出现故障。python faulthandlergdb

如果这是python的错误或功能,或者我做错了什么,我徘徊,我该如何修复这个错误。

我将感谢您的慷慨帮助。


这个问题与这个问题不同,正如我使用的,如果我将这个 lambda 函数扩展为普通函数,它运行良好,与上面描述的问题不同。python 3.11

Python 函数式编程 分段-故障 lambda 演算

评论

0赞 OCa 9/29/2023
这回答了你的问题吗?从 Python 2.6 到 2.7 时深度递归的分段错误

答: 暂无答案