関数型?Mathematicaの落とし穴プログラミング中、実際に遭遇した落とし穴の事例。展開したときの係数と、その係数リストの長さを内部計算で必要とするようなコードを書いていたとする。このとき、引数関数が余弦関数ならば、となり、意図した結果となる。正弦関数ならば、となってしまう。内部コードでリストの長さの判定条件にこれを使用していたら、エラーが発生する。等を用いて、リストの末尾に要素0を補う必要がある。多項式の係数を求める組み込み関数である。使用するのが本来の方法であり、かつオールマイティーな方法であると思われる。どちらを使うのが望ましいかは、個々の問題や条件によって異なってくると思われるので、実際には動作テストで確認した方がいい。ときは、パターンマッチングで次のように指定する。変数が行列のとき、パターンマッチングで次のように指定すると、うまくいかない。(パターンにマッチしないと判断されたため、入力した命令文がそのまま返されるだけとなる。)行列のときは、次のように指定すれば意図した動作をする。仕様によるものであり、全く理由はない。)これは特に、行列変数とベクトル変数が混在するようなコード内で混同しやすい。ループで記述しようとして、次の2通りのコードを書いた。)後者は意図した結果になる。求めようとしたが、誤った結果になっている。必須ではなく、もっと簡単な次のコードでも正しい結果になる。このコードは、前の例よりも計算が遅いのである!。高速化の定石は、ループ型ではなく、関数型プログラミングを用いることである。後者にも思わぬ落とし穴がある。以下、その一例を示す。虚部の大きさに応じて反復回数をどのように決めているかを確認する。実部が異なるいくつかの虚軸方向で描画した、反復回数のグラフ。概ね一次分数関数に近いように見える。そこで、この曲線に概ね適合する具体的な一次分数関数を求める。先の反復回数のグラフと重ねて描画してみると、よくフィットしていることが分かる。この結果を用いて、関数型プログラミングを作成する。これまでで最も高速である。上記のような加算回数の見積を行わず、単に固定回数で関数型プログラミングを作成すると、どのような結果になるか確認する。実軸の近傍では加算回数不足のため不正確になっている。逆に虚部が大きい領域では回数が冗長なため余分に時間がかかり、全体として遅くなっている。(つまり万能ではない)。