;; merge-sort : list-of-numbers -> list-of-numbers
(define (merge-sort l)
  (cond
    [(empty? l) empty]
    [else
     (merge (merge-sort (evens l))
            (merge-sort (odds l)))]))
;; merge : list-of-numbers list-of-numbers -> list-of-numbers
(define (merge l1 l2)
  (cond
    [(empty? l1) l2]
    [(empty? l2) l1]
    [else
     (cond
       [(<= (first l1) (first l2))
        (cons (first l1) (merge (rest l1) l2))]
       [else (cons (first l2) (merge l1 (rest l2)))])]))

;; evens : non-empty-list-of-numbers -> list-of-numbers
;; to extract alternating elements of l, skipping the first one.
(define (evens l)
  (cond
    [(empty? (rest l)) empty]
    [else (odds (rest l))]))
;; odds : non-empty-list-of-numbers -> list-of-numbers
;; to extract alternating elements of l, starting with the first one.
(define (odds l)
  (cond
    [(empty? (rest l)) l]
    [else (cons (first l) (evens (rest l)))]))

;; (some) examples
(evens (list 1 2 3 4)) = (list 2 4)
(odds (list 1 2 3 4)) = (list 1 3)

 

 

Is the function merge-sort generative or structurally recursive?

 

Solution
Generative

 

Is the function merge generative or structurally recursive?

 

Solution
Structural