2017-01-25 13 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.

Say a = 1, b = 2 и c = 3, выше линии будет эквивалентно

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

последняя строка (10 5), которая говорит «применить номер 5 к номеру 10» - который не имеет никакого смысла.

Вы также вносите ту же ошибку позже в код. Сначала попробуйте устранить эти проблемы, а затем обновите свой вопрос.

ps: не использовать имена snake_case, такие как sum_of_greatest_squares. Схемы обычно форматировали бы как sum-of-greatest-squares.


Непонятно, что ваша процедура должна делать в любом случае. Мой угадывает заключается в том, что он должен квадратировать два самых больших входа, а затем суммировать их.

You могли сделать огромную иерархию if выражений, чтобы решить, какие два аргумента для выполнения вычислений с ... но другой путь будет всегда использовать одни и те же два аргумента, чтобы вычислить результат, но использовать 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))))) 

Это всегда просуммировать квадраты двух больших чисел, но делает это в более простой способ


Наконец, Йорг что вы ничего не печатаете нигде. Я знаю, что вы подразумеваете, что DrRacket не показывает результат вашей программы в окне Взаимодействия.Однако, если вы хотите явно напечатать на консоли, посмотрите на display* and print* procedures

+0

В любом случае, ваш вопрос технически даже не разрешен на SO, потому что он имеет очевидные синтаксические ошибки. Я тупой, даже пытаясь ответить на него. – naomik

+0

Спасибо. Это не сработало из-за скобок. Это то, что я собирался. #lang SICP (определить (SQR х) (* хй)) (определить (суммарные из-больших квадратов а) (если (> абы) (если (> ас) (если (> Ьса) (+ (SQR а) (SQR б)) (+ (SQR а) (SQR с)) ) (+ (SQR а) (SQR с)) ) (если (> BC) (если (> ас) (+ (SQR а) (SQR б)) (+ (SQR б) (SQR с))) (+ (SQR с) (SQR б))) )) (сумма - наибольшие квадраты 7 8 10) – spheroid

+1

@spheroid у вас есть три уровня сравнений, в то время как 2 достаточно. Если вы знаете, что 'a' больше, чем' b', то 'a' является одним из двух самых больших. то вы берете самую большую из 'b' и' c'. В случае, когда 'a' меньше, чем' b', вы берете 'b' и самый большой из' a' и 'c'. – Sylwester