20

たとえば、次の関数を定義している場合

exprod[n_] := Expand[Product[x + i, {i, 1, n}]]

では、関数定義で変数nの後にアンダースコアが必要なのはなぜですか?このスタイルはどこから来たのですか、それともMathematicaプログラミング言語にのみ固有のものですか?

4

1 に答える 1

22

アンダースコアはパターン マッチングに由来します。

x_ は何にでも一致し、これは関数の本体で名前 x にバインドされます。

l[x_ * y_] := l[x] + l[y];

次に、l[2*z] では、最初に式 2*z がパターン x_ * y_ と照合されます。次に、x は 2 にバインドされ、y は z にバインドされます。次に、式 l[x] + l[y] が評価され、結果は l[2]+l[z] になります。

ここで、e の l の値を 1 と定義したいとします。l[e] := 1 と書きますか、それとも l[e_] := 1 と書きますか?

1 つは、(文字通り) 変数 e に対する l は 1 でなければならないというものです。もう 1 つは、何かに対する l は 1 になるというものです。

http://reference.wolfram.com/mathematica/tutorial/Introduction-Patterns.html

于 2012-05-21T16:44:19.063 に答える