(工事中)
関数の中である程度複雑な計算をする場合、 変数を使用する必要が生じるでしょうが、 局所的な変数を使用するようにしないと思わぬ副作用が生じます。
そのために用いるのが 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}] |