学习DrRacket,为什么这不会返回假?

时间:2016-11-12 01:30:41

标签: scheme racket

我今天刚刚开始学习DrRacket,我正在尝试编写一个简单的函数,如果一个数字可以被3整除则返回true,如果不是则可以返回false。我写了这个:

(define (DivByThree real)
  (cond
    (zero? (remainder real 3) #t)
    (else #f)
  )
)

然而,无论输入是什么,它都会返回#t。谁能解释我做错了什么?谢谢!

4 个答案:

答案 0 :(得分:2)

begin中的每个条件之后都有一个隐含的cond,并且由于您遗漏了一对括号,因此您的代码相当于

(define (DivByThree real)
  (cond
    (zero? (begin (remainder real 3) #t))
    (else #f)))

由于你的第一个条件是zero?,这是&#34; truthy&#34; (它不是#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")))