1

私が取り組んできた一連の問題があり、最後の問題が何を求めているのか理解できないようです。ここに最初の問題とそれに対する私の解決策があります:

a) ∑<sub> i = m .. n  f ( i )、 i = mからnまでの関数値f ( i )の合計を計算することに関心があることがよくあります。∑<sub> i = m .. n f ( i )を計算するものを定義します。これは、定義とは異なります。sigma f m n sigma (f, m, n)

fun sigma f m n = if (m=n) then f(m) else (f(m) + sigma f (m+1) n);

2番目の問題と私の解決策:

b) 上記の sigma の計算では、インデックス i は現在の i から次の値 i+1 に移動します。i が現在の i から次の i に移動する f(i) の合計を計算したい場合があります。たとえば、i+1 ではなく i+2 です。この情報を引数として送信すると、より一般化された合計を計算できます。このような合計を計算するには、'sum f next m n' を定義します。'next' は、現在のインデックス値から次のインデックス値を計算する関数です。(a) で「sigma」を取得するには、後続関数を「next」として送信します。

fun sum f next m n = if (m>=n) then f(m) else (f(m) + sum f (next) (next(m)) n);

そして、私の試みでの3番目の問題:

c) (b) の合計を一般化すると、合計だけでなく、積やその他の形式の累積も計算できます。(b) で合計を計算したい場合は、加算を引数として送信します。関数値の積を計算したい場合は、乗算を同じパラメーターの引数として送信します。また、オペレーターの身元も送信する必要があります。このような累積を計算するには、'accum hvf next m n' を定義します。ここで、h は累積を行うための 2 変数関数であり、v は累積のベース値です。h に乗算関数、v に 1、後続関数を 'next' として送信すると、この 'accum' は ∏<sub> i = m .. n  f ( i ) を計算します。'h' が足し算でも掛け算でもない例を作成します。

 fun accum h v f next m n = if (m>=n) then f(m) else (h (f(m)) (accum (h) (v) (f) (next) (next(m)) n));

問題 C では、"v" 引数をどうすればよいかわかりません。現在、関数は数値 m - n の任意の間隔を取り、それらに任意の種類の操作を適用します。たとえば、関数を呼び出すことができます

accum mult (4?) double next3 1 5;

ここで、double は倍増関数で、next3 は指定された値に 3 を加算します。v値をどのように利用するかについてのアイデアはありますか?

4

2 に答える 2