Python:嵌套lambdas--s_Push:解析器堆栈溢出内存错误`
问题描述
我最近偶然发现this article,它描述了如何在Ruby中只使用pros来编写FizzBuzz,因为我很无聊,所以我想尝试使用lambdas在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:分析器堆栈溢出
内存错误
我必须将其注释掉,文件才能运行。
这太糟糕了--有没有什么方法可以绕过这个限制,这样我就可以任意嵌套lambdas和函数调用,而不会出现Python崩溃和内存不足的情况?
或者,有没有某种Lambda演算技巧可以用来表示数字100,而不需要这么多嵌套函数?
解决方案
在没有这么多嵌套函数的情况下表示数字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
>>>
相关文章