<< Previous exercise (1.2) | sicp-solutions | Next exercise (1.4) >>
Exercise 1.3. Define a procedure that takes three numbers as arguments and returns the sum of the squares of the two larger numbers.
(define (square x) (* x x)) (define (squareSum x y) (+ (square x) (square y))) (define (sumOfLargestTwoSquared x y z) (cond ((and (>= (+ x y) (+ y z)) (>= (+ x y) (+ x z))) (squareSum x y)) ((and (>= (+ x z) (+ y z)) (>= (+ x z) (+ x y))) (squareSum x z)) (else (squareSum y z)) ) )
(sumOfLargestTwoSquared 1 2 3) ;Value: 13 (sumOfLargestTwoSquared 1 1 1) ;Value: 2 (sumOfLargestTwoSquared 1 2 2) ;Value: 8 (sumOfLargestTwoSquared 1 1 2) ;Value: 5 (sumOfLargestTwoSquared 1 4 3) ;Value: 25
Another possibility (uses some language constructs that haven't been introduced yet):
(define (square x) (* x x)) (define (sum-of-squares x y) (+ (square x) (square y))) (define (sum-of-squares-of-two-largest x y z) (let* ((smallest (min x y z)) (two-largest (remove smallest (list x y z)))) (apply sum-of-squares two-largest)))
Here's a version with simpler logic to detect the smallest of the three values: