Я недавно наткнулся на 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 без наличия множества вложенных функций?