【问题标题】:Using conditionals in Scheme在 Scheme 中使用条件
【发布时间】:2012-11-11 22:26:34
【问题描述】:

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

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

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

【问题讨论】:

    标签: scheme


    【解决方案1】:

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

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

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

    (< a b c d)
    

    还记得考虑两个或多个数字相等的情况(这就是为什么最好使用&lt;= 而不是&lt;)。

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

    【讨论】:

    • "...告诉你 a 是否是最小的数..." 不,它不会。 +1 表示最小值/最大值,-1 表示第二部分。胡。
    • 条件句中的 (map 以 OP 询问是否可以完成的方式执行 OP 所要求的操作。
    【解决方案2】:

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

    1. 编写您自己的最小值和最大值函数(提示:递归)。将两者都应用于列表以找到您的两个值。执行减法。
    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 &lt; x l) 全部返回 true,那么 x 小于 l 的所有元素。如果返回全部为 false,则 x 大于 l 的所有元素。所以你可以使用 ma​​p 来构建你想要的代码,但我认为这会很丑陋,而且不是最有效的方法。不过,它确实可以满足您的具体要求(列表元素的多个同时比较)。

    【讨论】:

      猜你喜欢
      • 2021-08-19
      • 1970-01-01
      • 1970-01-01
      • 2021-02-15
      • 2011-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多