我有一系列问题,我一直在努力,似乎无法理解最后一个问题。这是第一个问题,也是我的解决方案:
a)我们经常对计算Σ i = m .. n <感兴趣/ sub> f ( i ), i的函数值 f ( i )的总和 = m 到 n 。定义
不同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 + 1。我们可能想要计算其中i的f(i)之和 从当前的i到下一个,比如i + 2,而不是i + 1。如果我们寄这个 作为参数的信息,我们可以计算更广义 总和。定义'sum f next m n'来计算这样的求和,其中 'next'是一个从中计算下一个索引值的函数 当前指数值。要获得(a)中的“sigma”,您就会发送继任者 作为'下一个'充当。
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值的任何想法?
答案 0 :(得分:0)
这组问题旨在实现积累功能。需要
h
- 结合以前的值和当前值来生成下一个值v
- h
f
- 在将值传递给[m, n)
函数之前应用于h
间隔的值的函数next
- 按顺序计算下一个值m
和n
- boundary 以下是我定义accum
的方法:
fun accum h v f next m n = if m >= n then v else accum h (h (f m) v) f next (next m) n
C
中描述的示例如下所示:
fun sum x y = x + y;
fun mult x y = x * y;
fun id x = x;
accum sum 0 id next 1 10; (* sum [1, 10) staring 0 *)
accum mult 1 id next 1 10; (* prod [1, 10) starting 1 *)
例如,如果您在第一个示例中将1
作为10
传递,则可以计算从5
到5
以及加v
的数字总和。< / p>
答案 1 :(得分:0)
如果您考虑空间隔的可能性,说明会更有意义。
[n]
(n::nil
)。 否值列表为nil
。目前,您假设 m ≤ n ,并将 m = n 视为特殊处理返回f m
的案例。另一种方法是处理 m &gt; n 作为特例,返回v
。然后,当 m = n 时,您的函数将自动返回h v (f m)
,这与(f m)
相同(前提是 v < / em>已正确选择 h )。
老实说,我认为当函数的参数指定格式的间隔[ m , n <时, v -less方法很好/ em>],因为这样的函数不支持空间隔的逻辑原因。 (我的意思是,[ m , m -1]并不是“空间隔”,因为它是“明显错误”。) v < / em> -ful方法主要是有用的,当函数的参数以某种方式指定一个列表或一组元素时,可能可以想象为空,例如作为'a list
。