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