6

私は最近、Ruby で Proc のみを使用して FizzBu​​zz をコーディングする方法を説明しているこの記事に出くわしました。退屈だったので、ラムダを使用して 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 を表現するために使用できるラムダ計算のトリックはありますか?

4

3 に答える 3

9

ネストされた関数をあまり持たずに 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
>>> 
于 2012-10-22T08:20:30.310 に答える
7

Pythonを再コンパイルしないとできないようです。パーサー スタック サイズは、定数 MAXSTACK で設定されparser.hます。この値を増やし、再コンパイルして制限を増やすことができます。http://bugs.python.org/issue3971およびhttp://mail.python.org/pipermail/python-list/2012-March/621555.htmlを参照してください。

于 2012-10-22T06:11:28.857 に答える
2

ラムダ計算の観点から、数値のインクリメントは次の関数で実行できます。

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

次にone = succ(zero)、、、two = succ(one)など。

于 2012-10-22T07:01:28.753 に答える