私は最近、Ruby で Proc のみを使用して FizzBuzz をコーディングする方法を説明しているこの記事に出くわしました。退屈だったので、ラムダを使用して 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
ファイルをまったく実行するには、コメントアウトする必要があります。
このようなのはひどいものです - この制限を回避して、Python が落ちてメモリ不足になることなく、ラムダと関数呼び出しを任意にネストできるようにする方法はありますか?
または、ネストされた関数をあまり使わずに数値 100 を表現するために使用できるラムダ計算のトリックはありますか?