Сумма квадратов двух наибольших из трех чисел


Поставлены следующие задачи (упражнения SICP 1.3):

Определите процедуру, которая принимает три числа в качестве аргументов и возвращает сумма квадратов двух крупнейших цифры.

Я написал следующее (Несколько корявый) решение в схеме. Как я могу сделать это лучше?

(define (greatest-two a b c)
  (cond ((> a b) (cond ((> b c) (list a b))
                       (else (list a c))))
        ((> a c) (cond ((> c b) (list a c))
                       (else (list a b))))
        (else (list b c))))

(define (square x) (* x x))
(define (sum-of-squares a b) (+ (square a) (square b)))
(define (f a b c)
  (apply sum-of-squares (greatest-two a b c)))


4228
8
задан 23 марта 2011 в 02:03 Источник Поделиться
Комментарии
1 ответ

Схема является гораздо более функциональной, чем общий Лисп. Как вы можете применить это к данной ситуации путем более широкого применения функции передачи Вокруг (до такой степени, что эта проблема почти один-лайнер). Для головоломки, как написано, Я бы сделал что-то вроде

(define (big-squares a b c)
(apply + (map (lambda (n) (* n n))
(take (sort (list a b c) >) 2))))

Если вы хотели разложить его правильно в имени функции

(define (square num) (expt num 2))
(define (sum num-list) (apply + num-list))
(define (two-biggest num-list) (take (sort num-list >) 2))

(define (big-squares a b c) (sum (map square (two-biggest (list a b c)))))

Если вы хотели пойти за борт, и бросают в

(define (squares num-list) (map square num-list))

который позволит вам определить большой-квадратов , как

(sum (squares (two-biggest (list a b c))))

(код выше в mzscheme)

9
ответ дан 23 марта 2011 в 05:03 Источник Поделиться