|
2.5.9 求まった値を記憶する関数
:=を使い関数の定義を作成するとき,関数の値は,その要求があるたびに再計算される.計算の種類によっては,同じ関数の値を何度も要求するような状況がでてくる.そのようなときは, Mathematicaが,求まったすべての関数値を覚えておくようにしておく.これを行うには,次の形式を使い関数を定義する.

求まった値を記憶する関数の定義
求まった値をすべて保持しておくように関数fを定義する.
In[1]:= f[x_] := f[x] = f[x - 1] + f[x - 2]
帰納的関数 fの取る最終条件を定義する.
In[2]:= f[0] = f[1] = 1
Out[2]= 
fのもともとの定義を確認する.
In[3]:= ?f


f[5]を計算させる.計算では,列 f[5], f[4], f[2]の各値が求められる.
In[4]:= f[5]
Out[4]= 
これまでに求まった fの値はすべて保持されている.
In[5]:= ?f


もう一度 f[5]を要求する.今度は,再計算はされずに保存された値が参照される.
In[6]:= f[5]
Out[6]= 
これまでの説明で, f[x_] := f[x] = f[x-1] + f[x-2]のような定義がどう働くか理解できたことと思う. f[x_]は,「プログラム」f[x] = f[x-1] + f[x-2]として定義される.関数fの値が要求されるときは,この「プログラム」が実行される.このプログラムは,最初に, f[x-1] + f[x-2]の値を計算し,次に,結果を f[x]として保存する.
数学の帰納的関係をプログラムするときは,一度計算した値を保持しておく形で関数を記述するとよい. 通常は,帰納的関係は,整数の引数 を取る関数 の値を求める.この引数は, , 等を引数とした同じ関数fの値から構成される.上で使った定義 はフィボナッチ(Fibonacci)の関数と呼ばれ,典型的な帰納的関係である.ここで重要な点は,もしも帰納的関係を繰り返し適用することで,例えば, を計算させる場合, の値を何回も計算するはめに陥る.そのような場合には, の値を覚えておき,将来必要になるときには,再計算をしないで参照するだけにする.
もちろん覚えさせて得する反面,どこかで損もする.計算は早くなるが,記憶のために余計なメモリが必要になる.したがって,むやみやたらには,値を保持するように指示をしない方がよい.この方法は,割合少ない個数の値しか生成しない関数に限って使う方がよいだろう.
|