1.15
; The sine of an angle (specified in radians) can be
; computed by making use of the approximation sin x ≈ x
; if x is sufficiently small, and the trigonometric identity
; sin x = 3 sin (x/3) − 4 sin^3 (x/3)
; to reduce the size of the argument of sin.
; (For purposes of this exercise an angle is considered
; “sufficiently small” if its magnitude is not greater than 0.1
; radians.) These ideas are incorporated in the following procedures:
(define (cube x) (* x x x))
(define (p x) (- (* 3 x) (* 4 (cube x))))
(define (sine angle)
(if (not (> (abs angle) 0.1))
angle
(p (sine (/ angle 3.0)))))
; a) How many times is the procedure "p" applied when (sine 12.15) is evaluated?
; Answer
; (sine 12.15)
; (p (sine 4.05))
; (p (p (sine 1.35)))
; (p (p (p (sine 0.45))))
; (p (p (p (p (sine 0.15)))))
; (p (p (p (p (p (sine 0.05))))))
; (p (p (p (p (p 0.05)))))
; => Procedure "p" is applied 5 times
; b) What is the order of growth in space and number of steps
; (as a function of a) used by the process generated by the
; sine procedure when (sine a) is evaluated?
; Anwer
; => Order of growth = O(log (a))
;
; To calculate number of steps,
; 0.05 x 3 x 3 x 3 x 3 x 3 = 12.15
; => 0.05 x 3^5 = 12.15
; => 3^5 = (12.15 / 0.05)
; -> rewriting, 5 = log3(12.15 / 0.05) (log base 3)
; Hence, we got 5 (number of steps) like above
; In general, we can say that,
; => no.of.steps = log3(a / 0.1) (since at 0.1, applying p is stopped)
; Since this number is not an integer, we would have to take upper
; bound of the number (ceiling)
;
; i.e. No.of.steps = ceil(log (a / 0.1) / log 3) (since, logb(a) = log a / log b)
(define (no-of-steps a)
(ceiling (/ (log (/ a 0.1)) (log 3)))
)