#lang racket (define/contract (minimum-sum nums) (-> (listof exact-integer?) exact-integer?) (let ([nums_size (length nums)]) (if (< nums_size 3) -1 (let _go ([m 153] [f nums] [s (cdr nums)] [t (cddr nums)]) ;(printf "m(~a) f(~a) s(~a) t(~a)\n" m f s t) (if (< (length f) 3) (if (= m 153) -1 m) (if (< (length s) 2) (_go m (cdr f) (cddr f) (cdddr f)) (if (pair? t) (let* ([fv (car f)] [sv (car s)] [tv (car t)]) (if (and (< fv sv) (> sv tv)) (_go (min (+ fv sv tv) m) f s (cdr t)) (_go m f s (cdr t)) ) ) (_go m f (cdr s) (cddr s)) ) ) ) ) ) ) ) (define (main) (define (r nums exp) (printf "(minimum-sum ~a) = ~a | Exp: ~a\n" nums (minimum-sum nums) exp ) ) (r '(8 6 1 5 3) 9) (r '(5 4 8 7 10 2) 13) (r '(6 5 4 3 4 5) -1) (r '(49 50 48) 147) ) (main)