2017-01-25 8 views
-1

なぜ以下のスキーム関数が結果を出力しないのか教えてください。私はDrRacketを使用しています。スキーム関数は印刷されません

#lang sicp 

(define (sqr x) (* x x)) 

(define (sum_of_greatest_squares a b c) 
    (if(> a b) 
     (if(> a c) 
      (if(> b c) 
        ((+ (sqr a) (sqr c))(+ (sqr a) (sqr b)))) 
      (+ (sqr a) (sqr c)) 
     ) 
     (if(> b c) 
      (if (> a c) 
        ((+ (sqr a) (sqr b))(+ (sqr b) (sqr c))) 
      (+ (sqr c) (sqr b)))) 
     )) 
(sum_of_greatest_squares 3 4 5) 
+0

どこでも印刷しません。 –

+1

http://stackoverflow.com/help/mcve – naomik

答えて

1

あなたの学習には細部を重視していません。あなたのコードには無数の間違いがあり、あなたは他の言語の習慣をあなたのスキームの学習に持ち込むことができます。 DrRacketは、プログラムに構文エラーがあることを明確に示しているので、これは始めるのに適しています。私が太字にしている

のセクションでは、あなたのコードの書式設定が悪いですelse表現

(define (sum_of_greatest_squares a b c) 
    (if(> a b) 
     (if(> a c) 
      (if(> b c) ((+ (sqr a) (sqr c))(+ (sqr a) (sqr b)))) 
      (+ (sqr a) (sqr c)) 
     ) 
     (if(> b c) 
      (if (> a c) ((+ (sqr a) (sqr b))(+ (sqr b) (sqr c))) 
      (+ (sqr c) (sqr b)))) 
     )) 

を逃すので、ミスが行われた場所、それが難しく見ることになります。沿って移動

は、ここにもう一つの大きな間違いは、あなたが好きな場所あなたは、いくつかの言語でできるようにあなただけの、()を置くことができない

((+ (sqr a) (sqr c))(+ (sqr a) (sqr b))) 

です。 ()は、Lisp/Scheme/Racketのプロシージャアプリケーションに使用されます。意味をなさない -

は、上記の行が

((+ (sqr 1) (sqr 3))(+ (sqr 1) (sqr 2))) 
((+ 1  9  )(+ 1  4  )) 
(10         5) 

最後の行は「数10に数5を適用する」と言う(10 5)であるのと同等になり、a = 1b = 2、およびc = 3言います。

コードの後半でも同じ誤りがあります。これらの問題を修正してから、質問を更新してください。

ps:sum_of_greatest_squaresのようなsnake_caseの名前は使用しないでください。スキーマは通常、それをsum-of-greatest-squaresと書式設定します。


とにかくあなたの手続きが何をすべきかはすぐに分かりません。私のの推測は、2つの最大の入力を2乗して合計することになっているということです。

あなたで計算を実行するためにどの二つの引数を決定するif式の巨大な階層を行うことができます...しかし、もう一つの方法は、常に結果を計算するために同じ2つの引数を使用することですが、それにif表現を使用適切な引数を正しい場所に移動します。

(define (sqr x) (* x x)) 

(define (sum-of-greatest-squares a b c) 
    (cond ((< a b) (sum-of-greatest-squares b c a)) 
     ((< b c) (sum-of-greatest-squares a c b)) 
     (else (+ (sqr a) (sqr b))))) 

これは常に2つの偉大な数字の二乗を合計するあなたの手順に横代替としてこれを考えてみましょうが、はるかにきれいな方法でそうする


最後に、イェルク実際に何も印刷していないと言います。 DrRacketがあなたのプログラムの結果をInteractionsウィンドウに表示していないことを暗示することを意味します。ただし、コンソールに明示的に印刷したい場合は、display* and print* procedures

+0

とにかく、文法上の誤りがあるので、あなたの質問は技術的にはSO上でも許可されていません。私はそれに答えることさえしようとしても馬鹿だ。 – naomik

+0

ありがとうございます。括弧のために動作しませんでした。これは私がやっていたものです。 ((* XX))(SQR xを定義する) ()ABC(和の-最大二乗を定義 (IF(> AB) (IF(> AC) (>(もしBC SICPます#lang ) (+(SQR A)(SQR B)) (+(SQR A)(SQR C)) ) (+(SQR A)(SQR C)) ) ((> BC場合) ( (> AC) (+(SQR A)(SQR B)) (+(SQR b)は(SQRのC))) (+(SQR C)(SQR B))であれば) )) (SUM最も大きい正方形の7 8 10) – spheroid

+1

@spheroidあなたは2つで十分ですが、3つの比較レベルがあります。 'a'が' b'より大きければ、 'a'は2つのうちの一つです。あなたは 'b'と' c'のうち最大のものを取る。 'a'が' b'より小さい場合、 'b'をとり、' a'と 'c'のうち最大のものを取る。 – Sylwester

関連する問題