;;
;; generate_numbers consumes three numbers and produces a list
;; of numbers.
;;
;; (generate_numbers start end interval) will generate a list of
;; numbers starting at start, each successive number will differ from
;; the previous by interval and the sequence will stop before it
;; exceeds end.
;;
;; Example usage:
;; (generate_numbers 1 10 1)
;;
(define (generate_numbers start end interval)
(cond
;; start == end ? just generate a list with end in it
[ (= start end) (cons end empty)]
;; is start is the only number in the list ?
[(< (abs (- start end)) interval) (cons start empty)]
;; if start is less than end, we need to count up
[(< start end)
(cons start (generate_numbers (+ interval start) end interval))]
[else
;; start must be > end, we need to count down.
(cons start (generate_numbers (- start interval) end interval))]))
;; tests
;;(generate_numbers 0 5 1) ; produces '(0 1 2 3 4 5)
;;(generate_numbers 10 5 1) ; produces '(10 9 8 7 6 5)
;; (generate_numbers 0 10 3) ; produces '(0 3 6 9)
;; (generate_numbers 100 1000 222) ; produces '(100 322 544 766 988)