2016-11-12 5 views
0

私はDrRacketの学習を始めました。数字が3で割り切れる場合はtrueを返し、そうでない場合はfalseを返す単純な関数を作成しようとしています。私はこれを書いた:DrRacketを学ぶ、なぜこれはfalseを返さないでしょうか?

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

しかし、それは入力が何であっても#tを返す。誰かが私が間違っていることを説明することはできますか?ありがとう!以下のような

+0

適切な指揮文を取得するには、「ゼロ(残り3本物の)?」:文「場合」また、唯一の2つの条件がある場合は、1を使用することができます。 – rnso

答えて

1

コード:

if some_condition 
    return true 
else 
    return false 

...は、通常はあまり意味がありません。

(define (DivByThree? num) (zero? (remainder num 3))) 
:あなたのケースでは

return some_condition 

(Schemeの構文、3で割り切れる)、それがダウンして、このようなものになる:あなたのsome_conditionはすでにあなたにもちょうどそれを返すことがありますので、正しい結果を生産しています

述語として、述語を定義しているので、おそらく名前の末尾に?が必要なことに注意してください(誰かが入力を3で割った値を返すとは仮定しません)。

1

condの各節は、 [question answer]の形式であることに注意してください。あなたの例では、カッコが間違っていました。

これを試してみてください:

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

condの各状態の後、暗黙のbeginあります、そしてあなたが括弧のペアを残しので、あなたのコードは、あなたの最初の条件があるので

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

に相当しますzero?は「真実」(それは#fではない)であり、その条件の値はシーケンスの値です(remainder real 3) #t)の場合、値は常に#tです。

これは正しいでしょう:

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

が、パターン

(cond ((p #t) 
     (else #f))) 

(if p #t #f) 

は不要であり、両方がちょうどpに置き換えることができます。 Schemeのプログラマは通常、疑問符でキャメルケースとエンド述語を使用していないので

、より多くの慣用的な定義は、整数でなければなりませんパラメータの「本当」の名前を使用していること

(define (div-by-three? integer) 
    (zero? (remainder integer 3))) 

注だろう非常に誤解を招く。

0

適切なcond文を得るには、 "ゼロ?(剰余実数3)"の周りにかっこが必要です。しかし、他の答えで詳述されているように#tと#fは必要ありません。あなただけの周りに括弧が必要

(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"))) 
関連する問題