最近,我偶然发现了这篇文章,该文章描述了如何仅在Ruby中使用Procs来编码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)
从零到十五的数字可以正常工作,但是如果我尝试创建数字100,则由于以下错误,文件将无法运行:
s_push:解析器堆栈溢出 MemoryError
我必须将其注释掉以使文件完全运行。
这种糟透了-有什么办法可以解决这个限制,以便我可以任意嵌套lambda和函数调用,而不会使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 >>>