;;To find the maximum difference in an array.
;;For details see http://programmingpraxis.com/2011/04/01/maximum-difference-in-an-array/
;;These kind of problems need to be proved that they are correct.
(define (max-diff array)
(let-values ([(j i o)
(for/fold ((i 0) (j 0) (min-index 0))
((index (in-range 1 (vector-length array))))
(diff array i j index min-index))])
(list i j)))
(define (diff array j i k m)
(let ([j-val (vector-ref array j)]
[i-val (vector-ref array i)]
[k-val (vector-ref array k)]
[m-val (vector-ref array m)])
(cond
[(< k-val i-val) (if (< k-val m-val)
(values j i k)
(values j i m))]
[(> k-val j-val) (values k m m)]
[(> (- k-val m-val) (- j-val i-val))
(values k m m)]
[else (values j i m)])))
(equal? '(3 4) (max-diff (vector 4 3 9 1 8 2 6 7 5)))
(equal? '(1 2) (max-diff (vector 4 2 9 1 8 3 6 7 5)))
(equal? '(3 7) (max-diff (vector 4 3 9 1 2 6 7 8 5)))