Идет ли моя реализация Упражнения SICP 1.3 в правильном направлении? - PullRequest
1 голос
/ 26 апреля 2020

В упражнении 1.3 в SICP предлагается определить процедуру, которая принимает в качестве аргументов 3 числа и возвращает сумму квадратов 2 самых больших чисел. Я думаю, что я понял это правильно, но я не был полностью уверен, покрыл ли я все случаи. Моя реализация выглядит следующим образом:

(define (bigsq a b c)
    (cond ((and (> a b) (> b c)) (+ (* a a) (* b b)))
          ((and (> a b) (not (> b c))) (+ (* a a) (* c c)))
          ((> c a) (+ (* b b) (* c c)))
          (else (+ (* a a) (* b b))))

Можно ли также записать эти первые 2 условия как одно? Также приветствуются любые комментарии по эффективности.

1 Ответ

1 голос
/ 26 апреля 2020

Для начала, мы могли бы использовать вспомогательную процедуру для реализации sum только один раз:

(define (sum x y)
  (+ (* x x) (* y y)))

Теперь для условий: учитывая, что порядок не имеет значения - (sum a b) является так же, как (sum b a), нужно рассмотреть только 4 случая, и мы можем избежать повторения некоторых сравнений, вложив if s:

(define (sum-max a b c)
  (if (>= a b)
      (if (>= b c)
          (sum a b)
          (sum a c))
      (if (>= a c)
          (sum b a)
          (sum b c))))
...