【问题标题】:If statements in RacketRacket 中的 If 语句
【发布时间】:2016-01-23 07:08:19
【问题描述】:

我正在尝试构造一个函数“number-crop”,它接受三个参数 x a b。如果 x 在数轴上的闭区间 [a, b] 的左侧,则返回 a。如果 x 在区间的右侧,则返回 b。否则,只返回 x。这就是我所拥有的:

(define (number-crop x a b)
  (if (max x a b) x b)
  (if (min x a b) x a))

我返回错误,“定义:预期函数体只有一个表达式,但发现了 1 个额外部分”。我是 Racket 的新手,所以我仍在尝试了解 if 语句在该语言中是如何工作的。

【问题讨论】:

    标签: if-statement racket


    【解决方案1】:

    Scheme/Racket if 表达式总是只有一个条件和两个分支。由于它们是表达式,而不是语句,因此它们非常有用,并且它们的功能与 C 系列语言中的条件“三元”运算符非常相似。但是,当您有多个条件时,您可能想要更接近if...else if 链的东西,这是通过cond 表单提供的。

    cond 形式与if 类似,除了可以有任意数量的“子句”,每个子句都由一个条件确定。使用cond,您的number-crop 函数将如下所示:

    (define (number-crop x a b)
      (cond
        [(< x a) a]
        [(> x b) b]
        [else    x]))
    

    (注意elsecond 内部是特殊的——它替换了最后一个子句的条件,并且如果其他情况失败,它总是运行。)

    这可能可行,但如果您已经可以访问 minmax,那么您实际上根本不需要分支!如果你把这两个函数一起使用,你可以写number-crop 不带if 也不 cond:

    (define (number-crop x a b)
      (min (max a x) b))
    

    这是可行的,因为同时组合 minmax 将有效地将值限制在给定范围内,前提是 a 始终是最小值,b 始终是最大值。

    【讨论】:

      【解决方案2】:

      在 Scheme (Racket) 中,函数被定义为返回一件事。在您的情况下,很清楚:您描述的操作的结果。然而,Scheme 在几个方面与大多数命令式语言不同。例如,如果您查看定义中的表达式,它包含两个表达式,一个接一个。这与 Scheme 中的“一个计算函数的表达式”假设相矛盾。

      此外,即使你用命令式语言编写它,你也会使用嵌套的 ifs,你当然可以在这里使用它。大致如下:

      (define (number-crop x a b)
        (if (= x (max x a b))
            b
            (if (= x (min x a b))
                a
                x)))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-13
        • 2011-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多