【问题标题】:Writing procedure with "and" and "or" in SchemeScheme中用“and”和“or”编写程序
【发布时间】:2021-09-08 11:51:00
【问题描述】:

我正在使用 DrRacket 学习 Scheme,并正在研究一个名为“sign”的过程,该过程接受一个参数,如果小于 0,则返回 -1,如果大于 0,则返回 1,如果 = 0,则返回 0。

我的代码如下

(define (sign x)
     (and (> x 0) 1)
      (and (= x 0) 0)
       (and (< x 0) -1))

我只能使用'and'和'or'在我的任务中编写代码,这意味着我不能使用'if'和'cond'等。

我的代码在使用(sign 5) 或其他任何东西运行时返回#t

【问题讨论】:

  • 我修复了缩进。这样更容易看到错误。
  • @ceving 但缩进可能是导致 OP 出错的部分原因...... :)

标签: scheme racket


【解决方案1】:

首先,sign 过程已经存在并且您正在覆盖它,这是需要注意的。

所以你有这个要求,在你的实现中只使用andor。好吧,您只是缺少or 部分:)

(define (sign x)
  (or
   (and (> x 0) 1)
   (and (= x 0) 0)
   (and (< x 0) -1)))

例如:

(sign -10) ; -1
(sign 100) ;  1
(sign 0)   ;  0

【讨论】:

    【解决方案2】:

    我的代码在使用(sign 5) 或其他任何东西运行时返回#t。

    这不是真的。参数为负时返回-1,否则返回#f

    想象一下打电话给(sign 1),那会:

    • (and (&gt; 1 0) 1) 被评估为 #t,但它的值不会返回或保存在任何地方,并且是死代码
    • (and (= 1 0) 0) 被评估为 #f,但它的值不会返回或保存在任何地方,并且是死代码
    • (and (&lt; x 0) -1) 被评估为 #f。由于它位于尾部位置,因此该值被返回并且是过程的结果。

    但是这个过程:

    (define (add a b)
      (display "adding "
      (display a)
      (display " and "
      (display b)
      (newline)
      (+ a b))
    

    这个有 6 个表达式,它们都在做一些有用的事情,因为前 5 个有副作用,打印 "adding &lt;a&gt; and &lt;b&gt;\n",而它们的返回值被忽略,最后一个表达式返回的是过程的结果。最后一个表达式称为尾部表达式。

    在创建过程时,除非设计使用了副作用,否则您不应使用多个表达式来完成工作。例如。你的 3 不能分开。您需要将它们结合起来的逻辑。由于错误值是#f,但每个结果都是一个数字并且始终被认为是正确的,因此您可以将这 3 个放在 or 中:

    (define (my-sign x)
      (or (and (> x 0) 1)
          (and (= x 0) 0)
          (and (< x 0) -1)))
    

    当调用 (my-sign 1) (&gt; x 0) 将是 #t 其中 1 被评估和第一个 and 表达式的结果,因为 or 将停止在第一个真值,结果变为 1 .另请注意,不需要最后一个表达式,因为我们知道如果它不高于或等于零,则它必须低于零。因此最后一个and 表达式可以替换为-1

    (define (my-sign x)
      (or (and (> x 0) 1)
          (and (= x 0) 0)
          -1)) ; if not equal or higher than 0 it has to be negative!
    

    【讨论】:

    • 错字可能不那么重要...但是代码中的错字... o_O :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    相关资源
    最近更新 更多