(工事中)
関数の中である程度複雑な計算をする場合、 変数を使用する必要が生じるでしょうが、 局所的な変数を使用するようにしないと思わぬ副作用が生じます。
そのために用いるのが Module[宣言する変数のリスト, ...] です。
次の例は、
局所変数 i と p (初期値として
を代入) を用いて、
階乗
を計算するための関数を定義したものです
(もちろん Mathematica には、階乗を計算する演算子 ! があるので、
こういう関数を作る必要はありませんが)。
fact[n_]:=Module[{i,p=1}, For[i=1, i<=n, i++, p=p*i]; p]
|
例えば、C言語だったら次のように書くところです。
int fact(int n)
{
int i, p = 1;
for (i = 1; i <= n; i++)
p *= i;
return p;
}
|
例えば
int main(void)
{
int i, n, f;
n=10;
for (i = 1; i <= n; i++) {
f=fact(i);
}
...
}
|
外見上、少し似ているけれど、全然違うのが Block[] です。
fact[n_]:=Block[{i,p=1}, For[i=1, i<=n, i++, p=p*i]; p]
|
例えば $RecursionLimit というグローバル変数がありますが、 一時的にこの値を変更して実行したい (デフォールトの値は 1024 だとか)、という場合は
Block[{$RecursionLimit = 50}, ...]
|
逆に、Block[] ではダメで、Module[] でないといけない、 という例をあげておきます。
mirror[z_]:=Module[{x=Re[z],y=Im[z]},-x+I y]
Plot3D[Re[mirror[x+I y]],{x,-3,3},{y,-3,3}]
|
TerminatedEvaluation["RecursionLimit"] |
mirror[z_]:=Block[{x=Re[z],y=Im[z]},-x+I y]
Plot3D[Re[mirror[xx+I yy]],{xx,-3,3},{yy,-3,3}]
|