1 / 36

מבוא מורחב למדעי המחשב בשפת Scheme

מבוא מורחב למדעי המחשב בשפת Scheme. תרגול 4. Outline. Repeated f Accelerating computations Fibonacci Let and let* Recursion examples Palindrome? Log Order of growth. f(x), f(f(x)), f(f(f(x))), … apply f, n times. Repeated f. Compose now Execute later. (define (compose f g)

xiang
Download Presentation

מבוא מורחב למדעי המחשב בשפת Scheme

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. מבוא מורחב למדעי המחשב בשפת Scheme תרגול 4

  2. Outline • Repeated f • Accelerating computations • Fibonacci • Let and let* • Recursion examples • Palindrome? • Log • Order of growth

  3. f(x), f(f(x)), f(f(f(x))), … apply f, n times Repeated f Compose now Execute later (define (compose f g) (lambda (x) (f (g x)))) (= n 1) f (repeated f (- n 1)) (define (repeated f n) (if (compose f ))) ((repeated inc 5) 100) => 105 ((repeated square 2) 5) => 625 3

  4. Repeated f - iterative Do nothing until called later (define (repeated-iter f n x) (if (= n 1) (f x) (repeated-iter f (- n 1) (f x)))) (define (repeated f n) (lambda (x) (repeated-iter f n x))) 4

  5. Repeated f – Iterative II (define (repeated f n) (define (repeated-iter count accum) (if (= count n) accum (repeated-iter (+ count 1) (compose f accum)))) (repeated-iter 1 f)) Compose now Execute later 5

  6. Smooth a function f: g(x) = (f(x – dx) + f(x) + f(x + dx)) / 3 Repeatedly smooth a function (define (repeated-smooth f n) ) (define (smooth f) (let ((dx 0.1)) )) (define (average x y z) (/ (+ x y z) 3)) (lambda (x) (average (f (- x dx)) (f x) (f (+ x dx)))) ((repeated smooth n) f) 6

  7. AcceleratingComputations

  8. Iterative Fibonacci (define (fib n) (define (fib-iter a b count) (if (= count 0) b (fib-iter (+ a b) a (- count 1))) (fib-iter 1 0 n)) • Computation time: (n) • Much better than Recursive implementation, but… • Can we do better?

  9. Slow vs Fast Expt • Slow (linear) • b0=1 • bn=bbn-1 • Fast (logarithmic) • bn=(b2)n/2if n is even • bn=bbn-1if n is odd • Can we do the same with Fibonacci?

  10. b a a+b 2a+b 3a+2b … Double Steps • Fibonacci Transformation: • 0 1 1 2 3 5 8 13 21 • Double Transformation:

  11. A Squaring Algorithm • If we can square (or multiply) linear transformations, we have an algorithm: • Apply Tn on (a,b), where: • Tn=(T2)n/2 If n is even • Tn=TTn-1 If n is odd

  12. Squaring Transformations • General Linear Transformation: • Squared:

  13. Iterative Algorithm • Initialize: • Stop condition: If count=0 return b • Step count is odd count is even

  14. Representing Transformations • We need to remember x, y, z, w • Fibonacci Transformations belong to a simpler family: • T01 is the basic Fibonacci transformation • Squaring (verify on your own!):

  15. Implementation (finally) (define fib n) (fib-iter 1 0 0 1 n)) (define (fib-iter a b p q count) (cond ((= count 0) b) ((even? count) (fib-iter a b (/ count 2) (else (fib-iter p q (- count 1)))) (+ (square p) (square q)) (+ (* 2 p q) (square q)) (+ (* b q) (* a q) (* a p)) (+ (* b p) (* a q))

  16. The syntactic sugar “Let” (define (f x y) ((lambda (a b) (+ (* x (square a)) (* y b) (* a b))) (+ 1 (* x y)) (- 1 y))) (define (f x y) (define (f-helper a b) (+ (* x (square a)) (* y b) (* a b))) (f-helper (+ 1 (* x y)) (- 1 y))) (define (f x y) (let ((a (+ 1 (* x y))) (b (- 1 y))) (+ (* x (square a)) (* y b) (* a b))))

  17. bindings The syntactic sugar “Let” (Let ((<var1> <exp1>) (<var2> <exp2>) .. (<varn> <expn>)) <body>) Is defined to be equivalent to: ((lambda (<var1> ….. <varn>) <body>) <exp1> <exp2> … <expn>)

  18. let* (let* ((<var1> <exp1>)… (<varn> <expn>)) <body>) Is equivalent to (let ((<var1> <exp1>)) (let* ((<var2> <exp2>)… (<varn> <expn>)) <body>)) 18

  19. let vs. let* (let ((x 2) (y 3)) (let ((x 7) (z (+ x y))) (* z x))) ==> 35

  20. let vs. let* (let ((x 2) (y 3)) (let* ((x 7) (z (+ x y))) (* z x))) ==> 70

  21. palindrome? • Palindromes are (positive) numbers that read the same in both directions (e.g. left to right and right to left). • Write a procedure (palindrome? x) that gets an integer as parameter and returns true (#t) if the number is a palindrome and false (#f) otherwise.

  22. Examples > (palindrome? 1234567) #f > (palindrome? 1234321) #t > (palindrome? 56865) #t

  23. Useful functions (define(least-significantx) (remainder x 10)) (define(remove-least-significantx) (quotient x 10))

  24. Implementation • Construct a new number by reversing the digits of the input (x) • Test whether these two numbers are equal.

  25. reverse-num (define(reverse-numx) (define(helperxfactor) (if (< x 10) x (+ (* () factor) (helper () (/ factor 10))))) (define(factorx) (if (< x 10) 1 (*10 (factor ())))) (helper x (factor x)))

  26. reverse-num (define(reverse-numx) (define(helperxfactor) (if (< x 10) x (+ (* (least-significant x) factor) (helper () (/ factor 10))))) (define(factorx) (if (< x 10) 1 (*10 (factor ())))) (helper x (factor x)))

  27. reverse-num (define(reverse-numx) (define(helperxfactor) (if (< x 10) x (+ (* (least-significant x) factor) (helper (remove-least-significant x) (/ factor 10))))) (define(factorx) (if (< x 10) 1 (*10 (factor ())))) (helper x (factor x)))

  28. reverse-num (define(reverse-numx) (define(helperxfactor) (if (< x 10) x (+ (* (least-significant x) factor) (helper (remove-least-significant x) (/ factor 10))))) (define(factorx) (if (< x 10) 1 (*10 (factor (remove-least-significant x))))) (helper x (factor x)))

  29. palindrome? (define(palindrome?x) (if (< x 0) #f (= x (reverse-num x))))

  30. log Consider the function defined as follows: lg(1) = 0 lg(n) = lg(⌊n/2⌋) + 1, n > 1 *Do not use mathematical functions not shown here, such as exptor sqrt. *You may use (floor x) to compute ⌊x⌋.

  31. Recursive process  (define (lg n) (if (= n 1) 0 (+ (lg (floor (/ n 2))) 1))) 

  32. Iterative process (define (lg n) (define (helper n result) (if (= n 1) result (helper () ()))) (helper n 0)) 

  33. Iterative process (define (lg n) (define (helper n result) (if (= n 1) result (helper (floor (/ n 2)) ()))) (helper n 0)) 

  34. Iterative process (define (lg n) (define (helper n result) (if (= n 1) result (helper (floor (/ n 2)) (+ result 1)))) (helper n 0)) 

  35. Order of Growth • For each of the following statements, determine whether it is true or false. If it is true, provide a proof, if false, provide a counterexample. • Θ(2^n) = Θ(3^n) • 2^(3*lg n+2) = O(n^3)

  36. Order of Growth

More Related