我有一系列问题,我一直在努力,似乎无法理解最后一个问题 . 这是第一个问题,我的解决方案是:
a)我们常常对计算Σi= m..n f(i)感兴趣,i = m到n的函数值f(i)之和 . 定义sigma f m n,它计算Σi= m..n f(i) . 这与定义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 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)中推广和,我们不仅可以计算总和,还可以计算产品和其他形式的积累 . 如果我们想要计算(b)中的和,我们发送加法作为参数;如果我们想要计算函数值的乘积,我们发送乘法作为相同参数的参数 . 我们还必须发送运营商的身份 . 定义'accum h v f next m n'来计算这样的累积,其中h是用于累积的双变量函数,v是累积的基础值 . 如果我们发送乘法函数为h,1为v,后继函数为'next',则'accum'计算Π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值的任何想法?
2 回答
这组问题旨在实现累积功能 . 它需要
h
- 组合先前的值和当前值以生成下一个值v
-h
的起始值f
- 在将它们传递给h
函数之前应用于[m, n)
区间的值的函数next
- 按顺序计算下一个值m
和n
- 边界以下是我如何定义
accum
:C
中描述的示例如下所示:例如,如果在第一个示例中将
5
作为v
传递,则可以计算从1
到10
和5
的数字之和 .如果考虑空间隔的可能性,说明将更有意义 .
单个值n的"sum"是n . 没有值的总和为零 .
单个值n的"product"是n . 没有 Value 的产品是一个 .
单个值n的列表是
[n]
(n::nil
) . 没有值的列表是nil
.目前,您假设m≤n,并将m = n视为返回
f m
的特殊情况 . 另一种方法是将m> n视为特殊情况,返回v
. 然后,当m = n时,您的函数将自动返回h v (f m)
,这与(f m)
相同(前提是已为此h正确选择了v) .但是老实说,我认为当函数的参数指定格式[m,n]的区间时,v-less方法很好,因为没有逻辑上的原因,这样的函数会支持空间隔 . (我的意思是,[m,m-1]并不是"the empty interval",因为它是"obvious error" . )当函数的参数以某种方式指定一个列表或一组元素时,v-ful方法主要是有用的 . 空的,例如作为
'a list
.