【问题标题】:Multiple conditions without using boolean operators in Scheme在 Scheme 中不使用布尔运算符的多个条件
【发布时间】:2021-02-15 11:04:03
【问题描述】:

我不知道怎么问这个问题。基本上,我的教授解决了一个问题,他没有在 cond 语句中使用布尔表达式(and,or,not)。所以,我试图想出一个虚拟的例子,我发现了一些奇怪的东西。正如你在下面看到的。我不知道为什么 true false 给我 false 而不是转到 else 语句,但是当我做 false true 时,它​​转到 else 语句。我将其视为 AND 运算符,我知道我错了。

(cond ((= 2 2) (= 3 3))
      (else "Hello"))   ; --> T T --> #t

(cond ((= 2 2) (= 3 1))
      (else "Hello"))   ; --> T F --> #f

(cond ((= 2 1) (= 3 3))
      (else "Hello"))   ; --> F T --> "Hello"

(cond ((= 2 1) (= 3 1))
      (else "Hello"))   ; --> F F --> "Hello"

【问题讨论】:

  • 每个子句的car是一个条件,如果这个条件成立,其他的都是执行的。

标签: functional-programming scheme racket


【解决方案1】:

cond 语法是

(cond (condition1 value1)
      (condition2 value2)
      ...
      (conditionN valueN))

所以你的条件是(= 2 2)(= 2 1)else(相当于cond-表达式中的#t),可能的值为(= 3 3)(= 3 1)和`“你好”。

(cond (condition value1) 
      (else value2))

等价于

(if condition value1 value2)

所以你有相当于

(if (= 2 2)
    (= 3 3)
    "Hello")

(if (= 2 2)
    (= 3 1)
    "Hello")

等等。

【讨论】:

    【解决方案2】:

    您应该知道三个方程式。

    1.

    (cond
      [#t <A>]
      .........)
    

    计算为&lt;A&gt;

    2.

    (cond
      [#f <A>]
      .........)
    

    评估为

    (cond
      .........)
    

    也就是说,当一个子句的 LHS 是 #f 时,只需“划掉”那个子句。

    3.

    (cond
      [else <A>])
    

    计算为&lt;A&gt;

    在你的例子中:

    1.

    (cond ((= 2 2) (= 3 3))
          (else "Hello"))
    

    =

    (cond (#t (= 3 3))
          (else "Hello"))
    

    通过使用第一个等式,我们得到结果应该是(= 3 3) = #t

    2.

    (cond ((= 2 2) (= 3 1))
          (else "Hello"))
    

    =

    (cond (#t (= 3 1))
          (else "Hello"))
    

    通过使用第一个等式,我们得到结果应该是(= 3 1) = #f

    3.

    (cond ((= 2 1) (= 3 3))
          (else "Hello"))
    

    =

    (cond (#f (= 3 3))
          (else "Hello"))
    

    通过使用第二个等式,我们得到它应该计算为:

    (cond (else "Hello"))
    

    通过使用第三个等式,我们得到它应该评估为"Hello"

    4.

    (cond ((= 2 1) (= 3 1))
          (else "Hello"))
    

    =

    (cond (#f (= 3 1))
          (else "Hello"))
    

    通过使用第二个等式,我们得到它应该计算为:

    (cond (else "Hello"))
    

    通过使用第三个等式,我们得到它应该评估为"Hello"

    【讨论】:

      猜你喜欢
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      • 1970-01-01
      • 2021-11-06
      相关资源
      最近更新 更多