То, что вы написали (минус один дополнительный парень):
(define (sumsq a b c)
(define highest
(if (> (if (> a b) a b)
(if (> a c) a c))
(if (> a b) a b)
(if (> a c) a c)))
(define second_h
(if (> (if (> a b) b a)
(if (> a c) c a))
(if (> a b) b a)
(if (> a c) c a)))
(+ (* highest highest) (* second_h second_h)))
Их решение делит квадраты и суммы квадратов на отдельные функции, но я не думаю, что это важно. Если вы не напишите (+ (* a a) (* b b))
, то лишит вас необходимости называть два вычисляемых значения, что позволит вам написать функцию в виде одного большого выражения в конце, но теперь есть о чем беспокоиться. .
Думаю, проблема в том, что ваши (если ...) выражения слишком велики, чтобы их было легко понять. Обратите внимание, что есть два шаблона, которые появляются много раз: (if (> a b) a b)
и (if (> a b) b a)
. Это функции max и min, поэтому полезно определить их так:
(define (min a b) (if (< a b) a b))
(define (max a b) (if (< a b) b a))
Таким образом, вы можете переписать ваше решение как:
(define (sumsq a b c)
(define highest
(if (> (max a b) (max a c))
(max a b)
(max a c)))
(define second_h
(if (> (min a b) (min a c))
(min a b)
(min a c)))
(+ (* highest highest) (* second_h second_h)))
Упрощение снова дает:
(define (sumsq a b c)
(define highest
(max (max a b) (max a c)))
(define second_h
(max (min a b) (min a c)))
(+ (* highest highest) (* second_h second_h)))
Обратите внимание, что этот текст гораздо проще рассуждать, (max (max a b) (max a c))
, очевидно, является максимумом a
b
и c
и может быть переписан как (max (max a b) c)
. Глядя на second_h
, не очевидно, что это правильно. Что произойдет, если a
является наименьшим из трех значений?
Хитрость, которую они используют в своем решении, - сначала сравнить x
и y
. если x < y
, то вы знаете, что y
не является наименьшим из трех, поэтому он является либо самым высоким, либо вторым по величине. Другое число, которое вы захотите использовать, является более высоким из x
и z
, поскольку меньшее из этих двух будет самым маленьким из трех, которые вы хотите игнорировать. Аналогичная логика применяется, когда y < x
.