Finding Two Larger Numbers Out of Three

Sunday, Nov 3, 2019
Scheme Algorithms

This appears to be a fairly simple task and indeed it is when you can use list and sort functions in language like Python. However, I attempted to do this in Scheme using only conditional and single numbers as data. It turned out be a little tricky exercise for me. I had to explicitly define all the cases so my solution is not easily extensible to more numbers.

Problem: Define a procedure that takes three numbers as arguments and returns the sum of the squares of the two larger numbers.

Input: Three real numbers.

Output: Sum of squares of the two larger numbers.

Pseudocode

$\mathbf {Step ,1:} \text{ Read the three numbers x, y and z.}$

$\mathbf {Step ,2:} \text{ If } x \gt y \gt z, \text{set }a \leftarrow x, \text{set }b \leftarrow y$

$\mathbf {Step ,3:} \text{ If } x \lt y \lt z, \text{set }a \leftarrow y, \text{set }b \leftarrow z$

$ \mathbf {Step ,4:} \text{ If } x \gt y \lt z, \text{set }a \leftarrow x, \text{set }b \leftarrow z $

$ \mathbf {Step ,5:} \text{ If } (x \lt y \gt z)\land (x \lt z), \text{set }a \leftarrow y, \text{set }b \leftarrow z ,, \mathbf {else} \text{ set }a \leftarrow x, b \leftarrow y $

$ \mathbf {Step , 6:}, \text{Return } a^{2}+b^{2} $

Scheme Implementation

(define (square x) (* x x))

(define (squared-sum x y) (+ (square x) (square y)))

(define (squared-sumof-larger-two x y z)
  (cond ((and (> x y) (> y z)) (squared-sum x y))
        ((and (< x y) (< y z)) (squared-sum y z))
        ((and (> x y) (< y z)) (squared-sum x z))
        ((and (< x y) (> y z)) (if (< x z)
                                    (squared-sum z y)
                                    (squared-sum x y)
                                    )
                               )
        )
  )

Test

> (squared-sumof-larger-two 5 6 7)
85
> (squared-sumof-larger-two 9 -1 2)
85
> (squared-sumof-larger-two 2 3.2 -5)
14.240000000000002
>