Maximum Product Of Three, Revisited
June 30, 2017
Today’s exercise is simply stated:
Write a program that finds the maximum product of three numbers in a given array of integers.
We studied that problem in a previous exercise, where unfortunately we got it wrong. Here is the suggested solution from that exercise:
(define (max-prod-three xs)
(let ((len (length xs)) (xs (sort < xs)))
(cond ((< len 3) (error 'max-prod-three "insufficient input"))
((= len 3) (apply * xs))
((positive? (car xs))
(apply * (take 3 (reverse xs))))
((negative? (last xs))
(apply * (take 3 (reverse xs))))
((and (negative? (car xs)) (positive? (cadr xs)))
(apply * (take 3 (reverse xs))))
((and (negative? (cadr xs))
(negative? (caddr (reverse xs))))
(* (car xs) (cadr xs) (last xs)))
((and (negative? (cadr xs))
(positive? (caddr (reverse xs))))
(max (apply * (take 3 (reverse xs)))
(* (car xs) (cadr xs) (last xs))))
(else (error 'max-prod-three "missed case")))))
Your task is to write a correct program that finds the maximum product of three numbers in a given array of integers; you might start by figuring out what is wrong with the previous program. When you are finished, you are welcome to read or run a suggested solution, or to post your own solution or discuss the exercise in the comments below.