関数を反復的に適用する
計算プログラムを書いていると,ある操作を繰り返し行う必要が出てくる.そのようなときは,強力な構造体Nest,NestListを使い反復操作を行うことができる.
| Nest[f,x,n] | 関数 f を x に n 回繰り返し適用し,リストを生成する |
| NestList[f,x,n] | リスト を生成する.ここで f は n 回まで繰り返される |
引数が1個の関数を繰り返し適用する
Nest[f, x, n]は,関数の「名前」
f を取り出し,この関数を
x に
n 回繰り返し適用する.
| Out[1]= |  |
| Out[2]= |  |
| Out[4]= |  |
NestとNestListにより固定された回数だけ関数を適用することができる.結果に変化がなくなるまで関数を適用したいときはFixedPointおよびFixedPointListを使用する.
結果に変化がなくなるまで関数を適用する
これは,

をニュートン法で近似するときにステップを指定して計算する関数である.
始点

で開始させ,近似関数を5回ネストさせる.
| Out[6]= |  |
関数
FixedPointを使うことで,結果に変化がなくなるまで

を自動的に繰り返し適用させることができる.
| Out[7]= |  |
| 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 に与える |
テストが失敗するまで関数を反復適用する
結果が偶数でなくなるまで繰り返し

を適用する.
| Out[10]= |  |
| Out[11]= |  |
| 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引数の関数の繰り返し適用
| Out[13]= |  |
| Out[14]= |  |
| Out[15]= |  |
FoldとFoldListの機能を使うことで,読みやすくまた効率的なプログラムを書くことができる.場合によっては,FoldとFoldListを,第2引数でインデックスされている関数の族を単純なネストで生成するものと考えるとよい.
前回の値を次の桁に繰り上げていく関数を定義し,

と呼ぶ.
| Out[18]= |  |