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
过程已经存在并且您正在覆盖它,这是需要注意的。
所以你有这个要求,在你的实现中只使用and
,or
。好吧,您只是缺少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 (> 1 0) 1)
被评估为 #t
,但它的值不会返回或保存在任何地方,并且是死代码
(and (= 1 0) 0)
被评估为 #f
,但它的值不会返回或保存在任何地方,并且是死代码
(and (< x 0) -1)
被评估为 #f
。由于它位于尾部位置,因此该值被返回并且是过程的结果。
但是这个过程:
(define (add a b)
(display "adding "
(display a)
(display " and "
(display b)
(newline)
(+ a b))
这个有 6 个表达式,它们都在做一些有用的事情,因为前 5 个有副作用,打印 "adding <a> and <b>\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)
(> 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”编写程序的主要内容,如果未能解决你的问题,请参考以下文章
除了 AND/OR/NOT,其他逻辑运算符在编程中的意义何在?