1

我有一系列问题一直在解决,但似乎无法理解最后一个问题是什么。这是第一个问题,以及我的解决方案:

a) 我们经常对计算 ∑<sub> i = m .. n  f ( i ) 感兴趣,即 i = mn的函数值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 值的任何想法?

4

2 回答 2

0

This set of problems is designed to lead to implementation of accumulation function. It takes

  • h - combines previous value and current value to produce next value
  • v - starting value for h
  • f - function to be applied to values from [m, n) interval before passing them to h function
  • next - computes next value in sequence
  • m and n - boundaries

Here is how I'd define 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

Examples that were described in C will look like this:

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 *)

For example, you can calculate sum of numbers from 1 to 10 and plus 5 if you pass 5 as v in first example.

于 2013-09-27T20:15:53.257 回答
0

如果您考虑空区间的可能性,这些说明将更有意义。

  • 单个值n的“总和”是n没有值的总和为零。
  • 单个值n的“乘积”是n没有值的乘积是一。
  • 单个值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的方法很好,因为这样的函数没有逻辑理由支持空区间。(我的意思是, [ m , m -1] 与其说是“空区间”,不如说是“明显的错误”。)v -ful 方法主要在函数的参数指定一个列表或一组元素时有用某种可以想象为空的方式例如作为.'a list

于 2015-12-21T20:02:20.323 回答