|
2.6.10 評価中に式を集める
多くの場合は入力された式の評価の最終結果だけに興味があるが,評価の途中で生成された式を取り出したいこともある.SowとReapを使うとこれが可能になる.

SowとReapを使う
ここでは出力に最終結果しか入っていない.
In[1]:= a = 3; a += a^2 + 1; a = Sqrt[a + a^2]
Out[1]= 
次の場合は中間の2つの結果もまた含まれている.
In[2]:= Reap[Sow[a = 3]; a += Sow[a^2 + 1]; a = Sqrt[a + a^2]]
Out[2]= 
これは偶数項をすべて集めて総和を計算する.
In[3]:= Reap[Sum[If[EvenQ[#], Sow[#], #]& [i^2 + 1], {i, 10}]]
Out[3]= 
SowとReapはThrowやCatchのように計算のどこででも使うことができる.
Sowできる関数を定義する.
In[4]:= f[x_] := (If[x < 1/2, Sow[x]]; 3.5 x (1 - x))
これは1/2より小さな場合をすべて刈り取って関数をネストさせる.
In[5]:= Reap[Nest[f, 0.8, 10]]
Out[5]= 

タグ播きと刈り取り
これはのタグ xを付けて播かれた値だけを刈り取る.
In[6]:= Reap[Sow[1, x]; Sow[2, y]; Sow[3, x], x]
Out[6]= 
ここでは1がタグxを付けて2度播かれている.
In[7]:= Reap[Sow[1, {x, x}]; Sow[2, y]; Sow[3, x], x]
Out[7]= 
異なるタグを付けて播かれた値は異なるサブリストに入れられる.
In[8]:= Reap[Sow[1, {x, x}]; Sow[2, y]; Sow[3, x]]
Out[8]= 
これは播かれたタグの形式別のサブリストを作る.
In[9]:= Reap[Sow[1, {x, x}]; Sow[2, y]; Sow[3, x], {x, x, y}]
Out[9]= 
個々のタグと値のリストにfを適用する.
In[10]:= Reap[Sow[1, {x, x}]; Sow[2, y]; Sow[3, x], _, f]
Out[10]= 
このタグを計算の一部にすることができる.
In[11]:= Reap[Do[Sow[i/j, GCD[i, j]], {i, 4}, {j, i}]]
Out[11]= 
|