# sicp-ex-1.3

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
```

mdsib

Here's a version with simpler logic to detect the smallest of the three values:

``` (define (ssq a b) (+ (* a a) (* b b)))

(define (sumOfLargestTwoSquared x y z)
(cond ((and (<= x y) (<= x z)) (ssq y z))
((and (<= y x) (<= y z)) (ssq x z))
(else (ssq x y))))
```

master

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)))
```

An even simpler solution

```
(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)
(sum-of-squares (max x y) (max (min x y) z)))
```