1 / 31

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

מבוא מורחב למדעי המחשב בשפת Scheme. תרגול 2. Reminder: Recursive algorithm. Reduce problem to one or more sub-problems of smaller sizes (linear or tree recursion) and solve them recursively Solve the very small sized problems directly

beverlyt
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 תרגול 2

  2. Reminder: Recursive algorithm • Reduce problem to one or more sub-problems of smaller sizes (linear or tree recursion) and solve them recursively • Solve the very small sized problems directly • Usually some computations are required in order to split problem into sub-problems or /and to combine the results

  3. Example 1 • Compute f(n)=n! • Notice that f(n)=n*f(n-1) if n>1 and f(1)=1; • Algorithm: • If n=1 return 1 • Computing factorial for n-1 if n>1 • Multiply result by n and return

  4. Example 2a • Compute the average of set of n=2^k numbers • Avg({x1 .. xn})=(x1 +..+ xn)/n • Notice that: • Avg({x1 .. xn})=[Avg({x1 .. Xn/2})+Avg({xn/2+1 .. xn})]/2 • Algorithm • If input set size is 1, return the input as its average • Divide set into 2 subsets of n/2 if n>1 • Find an average of each subset • Return average of two results

  5. Example 2b • Compute the average of set of numbers • Avg({x1 .. xn})=(x1 +..+ xn)/n • Notice that: • Avg({x1 .. xn})=[xn + (n-1)*Avg({x1 .. Xn-1})]/n • Algorithm • If input set size is 1, return the input as its average • Find average of last n-1 numbers • Multiply result by (n-1) add xn and the divide by n

  6. Example 3 • Decide if the number x is a power of 2 F(x)= #t, if x=2^n for some n; or #f, otherwise • Notice • F(x)=F(x/2) if x is even, F(x)=#t if x=1 and #f otherwise • Algorithms • if x=1 return #t; If x is odd return #f; else • Compute and return for x/2

  7. Recursive calls • Function/procedure that calls to itself called recursive procedure • Can’t call to itself every time as have to stop somewhere • Recursive algorithms are usually implemented using recursive calls

  8. The conditional form (cond (<test-1> <consequent-1>) (<test-2> <consequent-2>) . . . (<test-n> <consequent-n>) (else <consequent-else>)) (define (abs x) (cond ((> x 0) x) ((= x 0) 0) (else (- x))))

  9. Scheme Examples • n! (define (f n) (if (= n 1) 1 (* n (f (- n 1)))))) • Decide whether x is a power of 2 (define (is_pow2 x) (cond ((= x 1) #t) ((odd? x) #f) (else (is_pow2 (/ x 2)))))

  10. Special case of recursive processes • No need to do computations after return of recursive call call call call call calc calc calc calc return val return val return val call call call call no calc no calc no calc calc return same val return same val return same val return val

  11. converting a tail recursive call to an iterative process call call call call don’t wait don’t wait don’t wait calc return val In Scheme, a tail recursive procedure results in an iterative process!

  12. Different Meanings of Recursions Recursive Algorithms Iterative Algorithms Recursive Scheme Function Tail Recursion Recursive Process Iterative Process

  13. Fibonacci Series Every element is the sum of its predecessors: 1, 1, 2, 3, 5, 8, 13, 21… Recursive algorithm fib(0) = 0 fib(1) = 1 fib(n) = fib(n-1) + fib(n-2) :n > 1 Tree recursion (define (fib n) (cond ((= n 0) 0) ((= n 1) 1) (else (+ (fib (- n 1)) (fib (- n 2)))))) Iterative algorithm Initialize: a = 1, b = 0 count = n Step:anew = aold + bold bnew = aold count = count - 1 Tail Recursion (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))

  14. Tree Recursion

  15. Implementing loops using tail recursion • Usually using helper local function (iterator) • Pass loop local variables as an argument (usually includes some sort of counter) • Check stopping condition • Make initial call with initial state arguments

  16. Example(Recursion) • Input: Amount of money : $1.50 • Output: Number of different ways to construct the amount using coins of 1,2,5,10,15,20,50 cents • Assume there is unlimited number of coins of each value

  17. = 2x = 3x + 4x = + + 93x Counting Change

  18. Counting Change CC( , { } ) = CC( , { } ) + CC( - , { } )

  19. Counting Change (define (count-change amount)  (cc amount 6)) (define (cc amount kinds-of-coins)  (cond ((= amount 0)  )        ((or (< amount 0) (= kinds-of-coins 0)) )        (else (+ (cc )                 (cc ))))) (define (first-denomination kinds-of-coins)  (cond ((= kinds-of-coins 1) 1)         ((= kinds-of-coins 2) 2)       ((= kinds-of-coins 3) 5) ((= kinds-of-coins 4) 10)          ((= kinds-of-coins 5) 20)         ((= kinds-of-coins 6) 50)))) 1 0 amount (- kinds-of-coins 1) (- amount (first-denomination kinds-of-coins)) kinds-of-coins

  20. Orders of Growth We say that function R(n)(f(n))if there are constants c1,c2> 0 such that for all n≥1 c1 f(n) ≤ R(n) ≤ c2 f(n) • We say that function R(n)O(f(n))if there is a constant c>0such that for all n≥1 • R(n) ≤cf(n) • We say that function R(n)(f(n))if there is a constant c>0such that for all n≥1 • cf(n)≤R(n) 20

  21. Asymptotic version • Suppose f(n)<g(n) for all n≥N, and 0<f(n),0<g(n) for all N>n≥1 • There is always a constant c such that f(n) < c*g(n) for all n ≥ 1 • C=(max{f(n): n<N}+1)/min{g(n): n<N} 21

  22. Practice 5n3 + 12n + 300n1/2 + 1  n2 + 30  350  25 n1/2 + 40log5n + 100000  12log2(n+1) + 6log(3n)  22n+3 + 37n15+ 9  (n3)  (n2) (1)  (n1/2) (log2n) (4n) 22

  23. Comparing algorithms • Running time of a program implementing specific algorithm may vary depending on • Speed of specific computer(e.g. CPU speed) • Specific implementation(e.g. programming language) • Other factors (e.g. input characteristics) • Compare number of operation required by different algorithms asymptotically, i.e. order of growth as size of input increases to infinity 23

  24. Efficient Algorithm • Algorithm for which number of operations and amount of required memory cells do not grow very fast as size of input increased • What operations to count? • What is input size (e.g. number of digits for representing input or input number itself)? • Different input of the same size can cause different running time. 24

  25. Efficient algorithms cont’d • Input size: usually the size of input representation (number of bits/digits) • Usually interested in worst case running time ,i.e. number of operations for worst case • Usually we count primitive operations (arithmetic and/or comparisons) 25

  26. Complexity Analysis Reminder: Space complexity - number of deferred operations(Scheme) Time complexity - number of primitive steps Method I – Qualitative Analysis Example: Factorial Each recursive call produce one deferred operation(multiplication) which takes constant time to perform Total number of operations(time complexity) (n) Maximum number of deferred operations(n) during the last call Method II – Recurrence Equations 26

  27. Recurrence Equations Code (define (sum-squares n) (if (= n 1) 1 (+ (square n) (sum-squares (- n 1)) ))) Recurrence T(n) = T(n-1) + (1) Solve T(n)  T(n-1) + c  T(n-2) + c + c  T(n-3) + c + c + c  … = T(1) + c + c + … + c = c + c + … + c = nc  O(n) 27

  28. Recurrence Equations Code (define (fib n) (cond ((= n 0) 0) ((= n 1) 1) (else (+(fib (- n 1))(fib (- n 2)) )))) Recurrence T(n) = T(n-1) + T(n-2) + (1) Solve For simplicity, we will solve T(n) = 2T(n-1) + (1), Which will give us an upper bound 28

  29. Recursion Trees (1) T(n-1) T(n-1) 2(1) T(n-2) T(n-2) T(n-2) T(n-2) 4(1) T(1) T(1) T(1) T(1) 2n-1(1) Total: (2n) T(n) 29

  30. Fibonacci - Complexity Time complexity T(n) < 2T(n-1)+(1) Upper Bound: O(2n) Tight Bound: (n)where =(5+1)/2 Space Complexity: (n) 30

  31. Common Recurrences T(n) = T(n-1) + (1)  (n) T(n) = T(n-1) + (n)  (n2) T(n) = T(n/2) + (1)  (logn) T(n) = T(n/2) + (n)  (n) T(n) = 2T(n-1) + (1)  (2n) T(n) = 2T(n/2) + (1)  (n) T(n) = 2T(n/2) + (n) (nlogn) 31

More Related