2012-10-22 1 views
4

Я недавно наткнулся на this article, в котором описывается, как закодировать FizzBuzz, используя только Procs в Ruby, и, поскольку мне было скучно, подумал, что было бы аккуратно попробовать и реализовать то же самое в Python, используя lambdas.Python: вложенные lambdas - `s_push: переполнение стека парсера Ошибка памяти

я попал в раздел, где вы создаете числа, используя вложенные функции, и написал следующий 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: parser stack overflow
MemoryError

Я должен прокомментировать его для того, чтобы файл для запуска на всех.

Этот вид отстойной - существует ли какой-либо способ этого ограничения, чтобы я мог произвольно вставлять вызовы lambdas и функций без падения Python и исчерпания памяти?

Или, альтернативно, есть какой-то трюк лямбда-исчисления, который я могу использовать для выражения числа 100 без наличия множества вложенных функций?

ответ

6

express the number 100 without having so many nested functions?

здесь вы идете:

>>> 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 
>>> 
5

Похоже, что это невозможно без перекомпиляции Python. Размер стека парсера устанавливается с константой MAXSTACK в parser.h. Вы можете увеличить это значение и перекомпилировать, чтобы увеличить лимит. См. http://bugs.python.org/issue3971 и http://mail.python.org/pipermail/python-list/2012-March/621555.html.

1

С лямбда-исчислении точки зрения, увеличивая число может быть сделано с помощью следующей функции:

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

Затем one = succ(zero), two = succ(one), и так далее.