3

我必须创建以下内容: 一个名为 'proc2' 的 Scheme 过程,它接受 4 个数字作为参数并返回最大参数减去最小参数的值。

所以我想写(定义 proc2 lambda(abcd) ... )

有什么方法可以同时评估 (> ab)、(> ac)、(> ad) 吗?我想获得最大(和最小)的数字,而不必编写嵌套的 if。

4

2 回答 2

0

可以用maxandmin程序吗?如果答案是肯定的,那很简单:

(- (max a b c d) (min a b c d))

如果不是,请记住 , <, >,<=接受>=可变数量的参数,所以这是有效的代码,并且会告诉您是否a小于、小于和小于b(尽管您必须测试更多的, ,组合确保这是最小值)。bccdbcda

(< a b c d)

还要记住考虑两个或多个数字相等的情况(这就是为什么使用<=而不是 是一个好主意<)。

无论如何,你必须使用条件。也许是嵌套if的,或者也许是cond为了让事情变得更简单——你可以自己解决细节,我猜这是家庭作业。

于 2012-11-11T22:30:20.870 回答
0

如果要查找列表中最小和最大的成员,并且不允许使用标准的minmax库函数,那么我可以想到三种方法

  1. 编写自己的 min 和 max 函数(提示:递归)。将两者都应用于列表以找到您的两个值。执行减法。
  2. 编写一个组合函数(同样,递归),它将通过列表一次,返回另一个包含最大值和最小值的两个成员列表。如果返回列表中的第一个元素是最大值,那么(apply - (find-min-and-max 3 2 8 7))find-min-and-max是您的函数的地方,将返回减法的结果。
  3. 使用地图

选项 1 的效率低于选项 2,但编写起来要简单得多。选项 3 比任何一个都更复杂,但实际上可以满足您的要求(即“同时”将abcd进行比较)。

例如,如果我定义了以下函数:

(define (compare test x l)
  (map (lambda (y) (test x y)) l))

然后

(compare < 3 '(1 2 4))

会回来(#f #f #t)

这对您有什么用处?好吧,如果(compare < x l)返回全部为真,则x小于l的所有元素。如果它返回全部 false,则x大于l的所有元素。所以你可以使用map来构建你想要的代码,但我认为这会很丑陋,而且不是最有效的方法。不过,它确实可以满足您的具体要求(列表元素的多个同时比较)。

于 2012-11-13T13:04:35.617 回答