我必须创建以下内容: 一个名为 'proc2' 的 Scheme 过程,它接受 4 个数字作为参数并返回最大参数减去最小参数的值。
所以我想写(定义 proc2 lambda(abcd) ... )
有什么方法可以同时评估 (> ab)、(> ac)、(> ad) 吗?我想获得最大(和最小)的数字,而不必编写嵌套的 if。
我必须创建以下内容: 一个名为 'proc2' 的 Scheme 过程,它接受 4 个数字作为参数并返回最大参数减去最小参数的值。
所以我想写(定义 proc2 lambda(abcd) ... )
有什么方法可以同时评估 (> ab)、(> ac)、(> ad) 吗?我想获得最大(和最小)的数字,而不必编写嵌套的 if。
可以用max
andmin
程序吗?如果答案是肯定的,那很简单:
(- (max a b c d) (min a b c d))
如果不是,请记住 , <
, >
,<=
接受>=
可变数量的参数,所以这是有效的代码,并且会告诉您是否a
小于、小于和小于b
(尽管您必须测试更多的, ,组合确保这是最小值)。b
c
c
d
b
c
d
a
(< a b c d)
还要记住考虑两个或多个数字相等的情况(这就是为什么使用<=
而不是 是一个好主意<
)。
无论如何,你必须使用条件。也许是嵌套if
的,或者也许是cond
为了让事情变得更简单——你可以自己解决细节,我猜这是家庭作业。
如果要查找列表中最小和最大的成员,并且不允许使用标准的min和max库函数,那么我可以想到三种方法
(apply - (find-min-and-max 3 2 8 7))
在find-min-and-max是您的函数的地方,将返回减法的结果。选项 1 的效率低于选项 2,但编写起来要简单得多。选项 3 比任何一个都更复杂,但实际上可以满足您的要求(即“同时”将a与b、c和d进行比较)。
例如,如果我定义了以下函数:
(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来构建你想要的代码,但我认为这会很丑陋,而且不是最有效的方法。不过,它确实可以满足您的具体要求(列表元素的多个同时比较)。