我今天刚刚开始学习DrRacket,我正在尝试编写一个简单的函数,如果一个数字可以被3整除则返回true,如果不是则可以返回false。我写了这个:
(define (DivByThree real)
(cond
(zero? (remainder real 3) #t)
(else #f)
)
)
然而,无论输入是什么,它都会返回#t。谁能解释我做错了什么?谢谢!
答案 0 :(得分:2)
在begin
中的每个条件之后都有一个隐含的cond
,并且由于您遗漏了一对括号,因此您的代码相当于
(define (DivByThree real)
(cond
(zero? (begin (remainder real 3) #t))
(else #f)))
由于你的第一个条件是zero?
,这是" truthy" (它不是#f
),该条件的值是序列 (remainder real 3) #t)
的值,值始终为#t
。< / p>
这是正确的:
(define (DivByThree real)
(cond
((zero? (remainder real 3)) #t))
(else #f)))
但模式
(cond ((p #t)
(else #f)))
和
(if p #t #f)
是不必要的,只能用p
替换。
由于Scheme程序员通常不使用CamelCase并使用问号结束谓词,因此更加惯用的定义
(define (div-by-three? integer)
(zero? (remainder integer 3)))
请注意,使用名称&#34; real&#34;对于必须是整数的参数,这是非常误导的。
答案 1 :(得分:1)
代码如:
if some_condition
return true
else
return false
......通常没有多大意义。您的some_condition
已经产生了正确的结果,所以您也可以将其返回:
return some_condition
在你的情况下(可以被三级整除,方法语法),可归结为:
(define (DivByThree? num) (zero? (remainder num 3)))
顺便说一句,请注意您正在定义一个谓词,因此您可能希望在名称的末尾加?
(所以有人不会假设它会去返回其输入除以3)。
答案 2 :(得分:1)
请注意cond
表达式中的每个子句都是表单
[question answer]
。在你的例子中,你有一些错位的括号。
试试这个:
(define (DivByThree real)
(cond
[(zero? (remainder real 3)) #t]
[else #f]))
答案 3 :(得分:0)
您只需要围绕“零?(余数为真3)”的括号来获得正确的cond语句。但是其他答案中没有详细说明#t和#f。此外,如果只有2个条件,可以使用“if”语句:
(define (DivByThree real)
(zero? (remainder real 3)))
(define (DivByThree2 real)
(cond
((zero? (remainder real 3))
(println "Yes"))
(else (println "No")))) ; "else" can be omitted here.
(define (DivByThree3 real)
(if (zero? (remainder real 3))
(println "Yes")
(println "No")))