You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

#### 62 lines 2.2 KiB Raw Permalink Blame History

 `(load "displaylib.scm")` `(title "Exercise 2.64")` `(print "` ` The following procedure list->tree converts an ordered list to a balanced binary tree. The helper procedure partial-tree takes as arguments an integer n and list of at least n elements and constructs a balanced tree containing the first n elements of the list. The result returned by partial-tree is a pair (formed with cons) whose car is the constructed tree and whose cdr is the list of elements not included in the tree.` ` (define (list->tree elements)` ` (car (partial-tree elements (length elements))))` ` (define (partial-tree elts n)` ` (if (= n 0)` ` (cons '() elts)` ` (let ((left-size (quotient (- n 1) 2)))` ` (let ((left-result (partial-tree elts left-size)))` ` (let ((left-tree (car left-result))` ` (non-left-elts (cdr left-result))` ` (right-size (- n (+ left-size 1))))` ` (let ((this-entry (car non-left-elts))` ` (right-result (partial-tree (cdr non-left-elts)` ` right-size)))` ` (let ((right-tree (car right-result))` ` (remaining-elts (cdr right-result)))` ` (cons (make-tree this-entry left-tree right-tree)` ` remaining-elts))))))))` ` a. Write a short paragraph explaining as clearly as you can how partial-tree works. Draw the tree produced by list->tree for the list (1 3 5 7 9 11).` ` b. What is the order of growth in the number of steps required by list->tree to convert a list of n elements? ` ` ")` ``` ``` `; a.` `;` `; The procedure is recursive:` `;` `; it first constructs (recursively) the left-tree` `; and using the remaining elements of the list` `; construct the root of the tree and the right-tree (recursively)` `;` `; example: (1 3 5 7 9 11) ` `;` `; => ( 1 3 5 7 9 11 ) 6` `;` `; make-left-tree => (1 3 5 7 9 11) 3 -> (3 (1) (5)) rest 7 9 11` `; take-root => 7` `; make-right-tree => (9 11) 2 -> (9 (11)), rest ()` `;` `; result => (7 (3 (1 5)) (9 (11)))` `;` `; b. Order of growth` `;` `; recursively: f(n) = c + 2f(n/2)` `; f(0) = c` `;` `; f(0) = c` `; f(1) = c + 2f(0) ~ 3c` `; f(2) = c + 2f(1) ~ 7c` `; f(4) = c + 2f(2) ~ 15c` `; etc...` `; f(2^n) = ϴ(2^n)` `; ` `; generally => f(n) = ϴ(n)` `;` ```; well played! ``` ``` ```