在Scheme中使用条件

时间:2012-11-11 22:26:35

标签: scheme

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

所以我想写 (定义proc2       lambda(a b c d)       ... )

我有什么方法可以同时评估(> a b),(> a c),(> a d)?我想获得最大(和最小)的数字,而不必编写嵌套的ifs。

2 个答案:

答案 0 :(得分:0)

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

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

如果没有,请记住<><=>=接受可变数量的参数,因此这是有效的代码,并会告诉您{{1} 1}}小于ab小于bc小于c(尽管您必须测试更多dbc的组合,以确保d是最小值。

a

另外请记住考虑两个或多个数字相等的情况(这就是为什么使用(< a b c d) 代替<=的好主意。)

无论如何,你必须使用条件。也许嵌套<,或者if来简化事情 - 你可以自己弄清楚细节,我猜这是作业。

答案 1 :(得分:0)

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

  1. 编写自己的最小和最大函数(提示:递归)。将两者应用于列表以查找您的两个值。执行减法。
  2. 编写一个组合函数(同样,递归),它将通过列表一次,返回另一个包含max和min的两个成员列表。如果返回列表中的第一个元素是最大值,那么(apply - (find-min-and-max 3 2 8 7)),其中 find-min-and-max 是您的函数,将返回减法的结果。
  3. 使用地图
  4. 选项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 来构建你想要的代码,但我认为这样做很丑陋而不是最有效的方法。尽管如此,它确实按照您的具体要求进行了操作(列表元素的多个同时比较)。