関数を反復的に適用する

計算プログラムを書いていると,ある操作を繰り返し行う必要が出てくる.そのようなときは,強力な構造体NestNestListを使い反復操作を行うことができる.

Nest[f,x,n]関数 fxn 回繰り返し適用し,リストを生成する
NestList[f,x,n]リストを生成する.ここで fn 回まで繰り返される

引数が1個の関数を繰り返し適用する

Nest[f, x, n]は,関数の「名前」f を取り出し,この関数を xn 回繰り返し適用する.
In[1]:=
Click for copyable input
Out[1]=
重ねてネストさせた結果をリスト構成にする.
In[2]:=
Click for copyable input
Out[2]=
簡単な関数を定義しておく.
In[3]:=
Click for copyable input
Nestを使い,関数を繰り返し適用する.
In[4]:=
Click for copyable input
Out[4]=

NestNestListにより固定された回数だけ関数を適用することができる.結果に変化がなくなるまで関数を適用したいときはFixedPointおよびFixedPointListを使用する.

FixedPoint[f,x]結果に変化がなくなるまで関数 f を反復適用する
FixedPointList[f,x]リストを生成し,要素が変化しなくなったとき停止する

結果に変化がなくなるまで関数を適用する

これは,をニュートン法で近似するときにステップを指定して計算する関数である.
In[5]:=
Click for copyable input
始点 で開始させ,近似関数を5回ネストさせる.
In[6]:=
Click for copyable input
Out[6]=
関数FixedPointを使うことで,結果に変化がなくなるまでを自動的に繰り返し適用させることができる.
In[7]:=
Click for copyable input
Out[7]=
変化の結果を順に並べる.
In[8]:=
Click for copyable input
Out[8]=
NestWhile[f,x,test]結果に test を適用してもTrueが返されなくなるまで関数 f を繰り返し適用する
NestWhileList[f,x,test]リストを生成し,test を結果に適用してもTrueが返されなくなったとき停止する
NestWhile[f,x,test,m], NestWhileList[f,x,test,m]
各ステップで最新の m 個の結果を test の引数として与える
NestWhile[f,x,test,All], NestWhileList[f,x,test,All]
これまでのすべての結果を引数として test に与える

テストが失敗するまで関数を反復適用する

与えられた数を2で割る関数.
In[9]:=
Click for copyable input
結果が偶数でなくなるまで繰り返しを適用する.
In[10]:=
Click for copyable input
Out[10]=
FixedPointListのように,2つの連続した結果がもはや互いに異なるとは判断されなくなるまでを反復適用する.
In[11]:=
Click for copyable input
Out[11]=
以前に見られた結果が再現されるまで継続する.
In[12]:=
Click for copyable input
Out[12]=

Nestのような関数操作では,引数が1つの関数 f を取り,それを繰り返し適用する.そして反復の各ステップにおいて,その直前のステップの結果を f の新たな引数として使う.

この考えを,引数が2つの関数にも使えるように一般化しておくことは大切である.その場合も,関数を繰り返し適用することができるが,得られる各結果は,次の関数適用で必要な2つの引数のうち1つしか提供することができない.そこで,別に2つ目の引数群をリストで用意しておき,そこから第2引数を逐次取り出し各ステップに当てる,という手順を使うと便利である.

FoldList[f,x,{a,b,...}]リストを構築する
Fold[f,x,{a,b,...}]FoldList[f, x, {a, b, ...}]で列挙した最終要素だけを出力する

2引数の関数の繰り返し適用

これは,FoldListの実行例である.
In[13]:=
Click for copyable input
Out[13]=
Foldは,FoldListの生成するリストの最終要素だけを返す.
In[14]:=
Click for copyable input
Out[14]=
累積和のリストを返す.
In[15]:=
Click for copyable input
Out[15]=

FoldFoldListの機能を使うことで,読みやすくまた効率的なプログラムを書くことができる.場合によっては,FoldFoldListを,第2引数でインデックスされている関数の族を単純なネストで生成するものと考えるとよい.

前回の値を次の桁に繰り上げていく関数を定義し,と呼ぶ.
In[16]:=
Click for copyable input
まるで組込み関数のFromDigitsのようになった.
In[17]:=
Click for copyable input
関数の動作確認をする.
In[18]:=
Click for copyable input
Out[18]=
New to Mathematica? Find your learning path »
Have a question? Ask support »