我有一系列问题一直在解决,但似乎无法理解最后一个问题是什么。这是第一个问题,以及我的解决方案:
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);
第二个问题,以及我的解决方案:
b) 在上述 sigma 的计算中,索引 i 从当前 i 变为下一个值 i+1。我们可能想要计算 f(i) 的总和,其中 i 从当前 i 到下一个 i,比如 i+2,而不是 i+1。如果我们将此信息作为参数发送,我们可以计算更广义的总和。定义“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);
第三个问题,我的尝试:
c) 推广 (b) 中的 sum,我们不仅可以计算求和,还可以计算乘积和其他形式的累加。如果我们想在 (b) 中计算总和,我们将加法作为参数发送;如果我们想计算函数值的乘积,我们将乘法作为同一参数的参数发送。我们还必须发送操作员的身份。定义 'accum hvf next m n' 来计算这种累加,其中 h 是用于累加的二变量函数,v 是累加的基值。如果我们为 h 发送乘法函数,为 v 发送 1,并将后继函数作为“下一个”,这个“累加”计算 ∏<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 值的任何想法?