Problem Set 1 Solutions Dan Dentinger ---------------------------------------------------------------------- HW Problem 1 Below is a sequence of expressions. What is the result you would expect from a scheme interpreter in response to each expression? Assume that the sequence is to be evaluated in the order in which it is presented. ==> (- 8 9) -1 ==> (> 3.7 4.4) #f ==> (- (if (> 3 4) 7 10) (/ 16 10)) 8.4 ==> (define b 13) b ==> 13 13 ==> b 13 ==> (define square (lambda (x) (* x x))) square ==> square square ==> (square 13) 169 ==> (square b) 169 ==> (square (square (/ b 1.3))) 1000 ==> (define multiply-by-itself square) multiply-by-itself ==> (multiply-by-itself b) 169 ==> (define quad (lambda (x) (square (square x)))) quad ==> quad quad ==> (define a b) a ==> (= a b) #t ==> (quad (/ a 1.3)) 10000 ==> (if (= (* b a) (square 13)) (< a b) (- a b)) #f ==> (cond ((>= a 2) b) ((< (square b) (multiply-by-itself a)) (/ 1 0)) (else (abs (- (square a) b)))) 13 ---------------------------------------------------------------------- HW Problem 2 (Book Exercise 1.4) (define (a-plus-abs-b a b) ((if (> b 0) + -) a b)) This procedure, given two numbers a and b calculates a + |b|. In essence, it does it using a trick. The above definition can be considered a shorthand for: (define (a-plus-abs-b a b) (if (> b 0) (+ a b) (- a b))) The trick is that the expression: (if (> b 0) + -) returns the procedure + or - dependent upon the sign of b. That operator is then applied to a and b, giving the proper answer. ---------------------------------------------------------------------- Original Snowflake programs (for your reference)... (define (side angle length level) (if (= level 0) (plot-line angle length) (4sides angle (/ length 3) (- level 1)))) (define (4sides angle length level) (side angle length level) (side (+ angle (/ pi 3)) length level) (side (- angle (/ pi 3)) length level) (side angle length level)) (define (snowflake length level) (side (/ pi 3) length level) (side (- (/ pi 3)) length level) (side pi length level)) (define pi (* 4 (atan 1 1))) ---------------------------------------------------------------------- Snowflake Problem 1 (define (side angle length level f) (if (= level 0) (plot-line angle length) (4sides angle (/ length 3) (- level 1) f))) (define (4sides angle length level f) (side angle length level f) (side (+ angle (* (f level) (/ pi 3))) length level f) (side (- angle (* (f level) (/ pi 3))) length level f) (side angle length level f)) (define (snowflake length level f) (side (/ pi 3) length level f) (side (- (/ pi 3)) length level f) (side pi length level f)) (define pi (* 4 (atan 1 1))) ---------------------------------------------------------------------- Snowflake Problem 2 (define (side angle length level f g) (if (= level 0) (plot-line angle length) (4sides angle (* (g level) (/ length 3)) (- level 1) f g))) (define (4sides angle length level f g) (side angle length level f g) (side (+ angle (* (f level) (/ pi 3))) length level f g) (side (- angle (* (f level) (/ pi 3))) length level f g) (side angle length level f g)) (define (snowflake length level f g) (side (/ pi 3) length level f g) (side (- (/ pi 3)) length level f g) (side pi length level f g)) (define pi (* 4 (atan 1 1))) ---------------------------------------------------------------------- Snowflake Problem 3 (define (side-length angle length level f g) (if (= level 0) length (4sides-lengths angle (* (g level) (/ length 3)) (- level 1) f g))) (define (4sides-lengths angle length level f g) (+ (side-length angle length level f g) (side-length (+ angle (* (f level) (/ pi 3))) length level f g) (side-length (- angle (* (f level) (/ pi 3))) length level f g) (side-length angle length level f g))) (define (snowflake-length length level f g) (+ (side-length (/ pi 3) length level f g) (side-length (- (/ pi 3)) length level f g) (side-length pi length level f g))) (define pi (* 4 (atan 1 1))) ---------------------------------------------------------------------- Snowflake Problem 4 total_length = 3 * (4/3)^level * length Proof: The procedure side calls 4-sides which in turn calls side 4 times with the length divided by 3 and the level decremented by one. For this it's easier to think of side as calling itself. Then you get the equations: T = total length of snowflake len = length of a side n = level of snowflake curve T(len,n) = 3 * side(len,n) side(len,n) = 4*side(len/3,n-1) side(len,0) = len side will be called recursively n times, at which point side(len,0) will return the length passed to it side(len,n) = 4 * (4 * (4 * ... * side(len/(3*3*3*...*3),0) ) ... ) ---------------------------------------------------------------------- Snowflake Problem 5 (define f (lambda (x) (+ (* x x) (* 3 x) 2))) (define g (lambda (x) (+ (* x x) (* 3 x) 2))) (snowflake-length 100 0 f g) 300 (snowflake-length 100 1 f g) 2400 (snowflake-length 100 2 f g) 38400 (snowflake-length 100 3 f g) 1024000 (snowflake-length 100 4 f g) 40960000 (define g (lambda (x) (sqrt x))) (snowflake-length 100 0 f g) 300 (snowflake-length 100 1 f g) 400 (snowflake-length 100 2 f g) 754.2472332656508 (snowflake-length 100 3 f g) 1741.8593726458153 (snowflake-length 100 4 f g) 4644.958327055508 (define g (lambda (x) (if (= x 0) 1 (/ 1 (* x x))))) (snowflake-length 100 0 f g) 300 (snowflake-length 100 1 f g) 400 (snowflake-length 100 2 f g) 133.33333333333334 (snowflake-length 100 3 f g) 19.753086419753085 (snowflake-length 100 4 f g) 1.646090534979424 ---------------------------------------------------------------------- Snowflake Problem 6 The return value of the last function called is the value of the function currently being evaluated. In the case of our program, during drawing, make-plotter is the last procedure called, which returns "pen-moved" upon successful execution. ----------------------------------------------------------------------