-->

的Python:嵌套lambda表达式 - `s_push:解析器堆栈溢出内存Error`(Pyth

2019-07-01 16:37发布

最近,我偶然发现这篇文章介绍如何编写FizzBu​​zz在Ruby中只使用特效,因为我很无聊,认为这将是整齐的尝试和使用lambda表达式在Python中实现同样的事情。

我要在其中创建使用嵌套函数号码段,并且写了下面的Python脚本:

#!/usr/bin/env python

zero  = lambda p : (lambda x: x)
one   = lambda p : (lambda x: p(x))
two   = lambda p : (lambda x: p(p(x)))
three = lambda p : (lambda x: p(p(p(x))))
five  = lambda p: (lambda x: p(p(p(p(p(x))))))

fifteen = lambda p : (lambda x: p(p(p(p(p( \
                                p(p(p(p(p( \
                                p(p(p(p(p(x))))))))))))))))


hundred = lambda p: (lambda x: p(p(p(p(p(p(p(p(p(p( \
                               p(p(p(p(p(p(p(p(p(p( \
                               p(p(p(p(p(p(p(p(p(p( \
                               p(p(p(p(p(p(p(p(p(p( \
                               p(p(p(p(p(p(p(p(p(p( \
                               p(p(p(p(p(p(p(p(p(p( \
                               p(p(p(p(p(p(p(p(p(p( \
                               p(p(p(p(p(p(p(p(p(p( \
                               p(p(p(p(p(p(p(p(p(p( \
                               p(p(p(p(p(p(p(p(p(p(x)))))))))))))))))))))))))))) \
                                                     ))))))))))))))))))))))))))) \
                                                     ))))))))))))))))))))))))))) \
                                                     )))))))))))))))))))

def to_int(func):
    return func(lambda n: n + 1)(0)

print to_int(zero)
print to_int(one)
print to_int(two)
print to_int(three)
print to_int(five)
print to_int(fifteen)
print to_int(hundred)

数字从0到15工作正常,但如果我尝试创建100号,该文件将不会因下列错误运行:

s_push:分析器堆栈溢出
的MemoryError

我必须把它注释掉,以便文件在所有运行。

这类吸的 - 是否有解决此限制的任何方式让我可以任意嵌套lambda表达式和函数调用没有Python的摔倒和运行内存不足?

或者另外,有某种拉姆达演算伎俩我可以用它来表示数字100,而无需那么多的嵌套函数?

Answer 1:

表达的数量100,而不必那么多嵌套函数?

干得好:

>>> test = lambda f: f(lambda x: x + 1)(0)
>>> z = lambda f: lambda x: x
>>> test(z)
0
>>> succ = lambda n: lambda f: lambda x: f(n(f)(x))
>>> _1 = succ(z)
>>> test(_1)
1
>>> _2 = succ(_1)
>>> test(_2)
2
>>> plus = lambda m: lambda n: lambda f: lambda x: m(f)(n(f)(x))
>>> _3 = plus(_1)(_2)
>>> test(_3)
3
>>> mult = lambda m: lambda n: lambda f: lambda x: m(n(f))(x)
>>> _6 = mult(_2)(_3)
>>> test(_6)
6
>>> _5 = plus(_2)(_3)
>>> _25 = mult(_5)(_5)
>>> _4 = plus(_2)(_2)
>>> _100 = mult(_25)(_4)
>>> test(_100)
100
>>> 


Answer 2:

它看起来像它不可能不重新编译的Python。 解析器堆栈大小被设定为在恒定MAXSTACK parser.h 。 你可以增加该值,并重新编译以提高额度。 见http://bugs.python.org/issue3971和http://mail.python.org/pipermail/python-list/2012-March/621555.html 。



Answer 3:

从拉姆达演算的角度来看,增加了一些可以用下面的函数来完成:

succ = lambda n: lambda p: lambda x: p(n(p)(x))

然后, one = succ(zero)two = succ(one) ,等等。



文章来源: Python: nested lambdas — `s_push: parser stack overflow Memory Error`