Scheme中用“and”和“or”编写程序

Posted

技术标签:

【中文标题】Scheme中用“and”和“or”编写程序【英文标题】:Writing procedure with "and" and "or" in Scheme 【发布时间】: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 出错的部分原因...... :) 【参考方案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 :)

以上是关于Scheme中用“and”和“or”编写程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在SparkR中使用AND和OR编写逻辑列表达式?

除了 AND/OR/NOT,其他逻辑运算符在编程中的意义何在?

scheme语言编写执行

为啥让首选在Scheme中定义?

在JAVA中用for循环编写程序计算1~100之间的奇数之和

英语中一般疑问句or和and的区别