recursion induction
play

Recursion & Induction CS16: Introduction to Algorithms & - PowerPoint PPT Presentation

Recursion & Induction CS16: Introduction to Algorithms & Data Structures Spring 2020 Outline Recursion Recurrence relations Plug & chug Induction Strong vs. weak induction 3 Scouting US CA IN RI NY Ind.


  1. Recursion & Induction CS16: Introduction to Algorithms & Data Structures Spring 2020

  2. Outline ‣ Recursion ‣ Recurrence relations ‣ Plug & chug ‣ Induction ‣ Strong vs. weak induction

  3. 3

  4. Scouting US CA IN RI NY Ind. Gary Pvd NP NYC Buff. SF LA 4

  5. Recursion ‣ What is a recursive problem? ‣ a problem defined in terms of itself ‣ What is a recursive function? ‣ a function defined in terms of itself ‣ example: Factorial, Fibonacci ‣ At each level, the problem gets easier/smaller 5

  6. “Something defined in terms of itself”

  7. Recursive Algorithms ‣ Algorithms that call themselves ‣ Call themselves on smaller inputs (sub-problems) ‣ Combine the results to find solution to larger input ‣ Recursive algorithms ‣ Can be very easy to describe & implement :-) ‣ Can be hard to think about and to analyze :-( 8

  8. <latexit sha1_base64="3zAFzfC230LCcLI/wPE8J1ECXug=">ACFnicbVBNSwMxFMzWr1q/Vj16S1CBS27IqgHoejFYwXFtpSsmnahmazS/JWLUv/hRf/ihcPKl7Fm/GbNuDtg4Ehpl5L3xI8E1OM63lZmbX1hcyi7nVlbX1jfsza1bHcaKMo+GIlQ1n2gmuGQecBCsFilGAl+wqt+/TP3qHVOah/IGBhFrBqQreYdTAkZq2SWZx+dYNoAHTBflobufP8ANYA8gQxUQkeB7Dj08xG6ac1t2wSk5I+BZ4k5IAU1QadlfjXZI4BJoIJoXedCJoJUcCpYMNcI9YsIrRPuqxuqCRmjWYyumuI94zSxp1QmScBj9TfEwkJtB4EvkGBHp62kvF/7x6DJ3TZsJlFAOTdPxRJxYQpyWhNtcMQpiYAihiptdMe0RSiYKnOmBHf65FniHZXOSu71caF8MWkji3bQLioiF52gMrpCFeQhih7RM3pFb9aT9WK9Wx/jaMazGyjP7A+fwBx5JyL</latexit> <latexit sha1_base64="3zAFzfC230LCcLI/wPE8J1ECXug=">ACFnicbVBNSwMxFMzWr1q/Vj16S1CBS27IqgHoejFYwXFtpSsmnahmazS/JWLUv/hRf/ihcPKl7Fm/GbNuDtg4Ehpl5L3xI8E1OM63lZmbX1hcyi7nVlbX1jfsza1bHcaKMo+GIlQ1n2gmuGQecBCsFilGAl+wqt+/TP3qHVOah/IGBhFrBqQreYdTAkZq2SWZx+dYNoAHTBflobufP8ANYA8gQxUQkeB7Dj08xG6ac1t2wSk5I+BZ4k5IAU1QadlfjXZI4BJoIJoXedCJoJUcCpYMNcI9YsIrRPuqxuqCRmjWYyumuI94zSxp1QmScBj9TfEwkJtB4EvkGBHp62kvF/7x6DJ3TZsJlFAOTdPxRJxYQpyWhNtcMQpiYAihiptdMe0RSiYKnOmBHf65FniHZXOSu71caF8MWkji3bQLioiF52gMrpCFeQhih7RM3pFb9aT9WK9Wx/jaMazGyjP7A+fwBx5JyL</latexit> <latexit sha1_base64="3zAFzfC230LCcLI/wPE8J1ECXug=">ACFnicbVBNSwMxFMzWr1q/Vj16S1CBS27IqgHoejFYwXFtpSsmnahmazS/JWLUv/hRf/ihcPKl7Fm/GbNuDtg4Ehpl5L3xI8E1OM63lZmbX1hcyi7nVlbX1jfsza1bHcaKMo+GIlQ1n2gmuGQecBCsFilGAl+wqt+/TP3qHVOah/IGBhFrBqQreYdTAkZq2SWZx+dYNoAHTBflobufP8ANYA8gQxUQkeB7Dj08xG6ac1t2wSk5I+BZ4k5IAU1QadlfjXZI4BJoIJoXedCJoJUcCpYMNcI9YsIrRPuqxuqCRmjWYyumuI94zSxp1QmScBj9TfEwkJtB4EvkGBHp62kvF/7x6DJ3TZsJlFAOTdPxRJxYQpyWhNtcMQpiYAihiptdMe0RSiYKnOmBHf65FniHZXOSu71caF8MWkji3bQLioiF52gMrpCFeQhih7RM3pFb9aT9WK9Wx/jaMazGyjP7A+fwBx5JyL</latexit> <latexit sha1_base64="3zAFzfC230LCcLI/wPE8J1ECXug=">ACFnicbVBNSwMxFMzWr1q/Vj16S1CBS27IqgHoejFYwXFtpSsmnahmazS/JWLUv/hRf/ihcPKl7Fm/GbNuDtg4Ehpl5L3xI8E1OM63lZmbX1hcyi7nVlbX1jfsza1bHcaKMo+GIlQ1n2gmuGQecBCsFilGAl+wqt+/TP3qHVOah/IGBhFrBqQreYdTAkZq2SWZx+dYNoAHTBflobufP8ANYA8gQxUQkeB7Dj08xG6ac1t2wSk5I+BZ4k5IAU1QadlfjXZI4BJoIJoXedCJoJUcCpYMNcI9YsIrRPuqxuqCRmjWYyumuI94zSxp1QmScBj9TfEwkJtB4EvkGBHp62kvF/7x6DJ3TZsJlFAOTdPxRJxYQpyWhNtcMQpiYAihiptdMe0RSiYKnOmBHf65FniHZXOSu71caF8MWkji3bQLioiF52gMrpCFeQhih7RM3pFb9aT9WK9Wx/jaMazGyjP7A+fwBx5JyL</latexit> Factorial n Y n ! = i = n × ( n − 1) × · · · × 1 iterative: i =1 recursive: n ! = n × ( n − 1)! , with 1! = 1 9

  9. Recursive Factorial — Simulation def factorial(n): if n == 1: return 1 else: return n * factorial (n-1) ‣ call factorial ( 3 ) 10

  10. Recursive Factorial — Simulation def factorial(n): if n == 1: return 1 else: return n * factorial (n-1) ‣ call factorial ( 3 ) ‣ level # 1 : 3 ≠ 1 so 3 x factorial ( 2 ) 11

  11. Recursive Factorial — Simulation def factorial(n): if n == 1: return 1 else: return n * factorial (n-1) ‣ call factorial ( 3 ) ‣ level # 1 : 3 ≠ 1 so 3 x factorial ( 2 ) ‣ level # 2 : 2 ≠ 1 so 2 x factorial ( 1 ) 12

  12. Recursive Factorial — Simulation def factorial(n): if n == 1: return 1 else: return n * factorial (n-1) ‣ call factorial ( 3 ) ‣ level # 1 : 3 ≠ 1 so 3 x factorial ( 2 ) ‣ level # 2 : 2 ≠ 1 so 2 x factorial ( 1 ) ‣ level # 3 : 1==1 so return 1 13

  13. Recursive Factorial — Simulation def factorial(n): if n == 1: return 1 else: return n * factorial (n-1) ‣ call factorial ( 3 ) ‣ level # 1 : 3 ≠ 1 so 3 x factorial ( 2 ) ‣ level # 2 : 2 ≠ 1 so 2 x 1 ‣ level # 3 : 1==1 so return 1 14

  14. Recursive Factorial — Simulation def factorial(n): if n == 1: return 1 else: return n * factorial (n-1) ‣ call factorial ( 3 ) ‣ level # 1 : 3 ≠ 1 so 3 x 2 ‣ level # 2 : 2 ≠ 1 so 2 x 1 ‣ level # 3 : 1==1 so return 1 15

  15. Recursive Factorial — Simulation def factorial(n): if n == 1: return 1 else: return n * factorial (n-1) ‣ call factorial ( 3 ) = 6 ‣ fact(3): 3 ≠ 1 so 3 x 2 ‣ level # 2 : 2 ≠ 1 so 2 x 1 ‣ level # 3 : 1==1 so return 1 16

  16. Wait a minute!! you keep calling factorial but never actually implemented it

  17. Recursive Factorial — Simulation def factorial(n): if n == 1: return 1 else: return n * factorial(n-1) 18

  18. Recursive Factorial — Simulation def factorial(n): if n == 1: return 1 else: return n * factorial(n-1) 19

  19. Recursion & Clones ‣ At each intersection ‣ clone yourself twice and send one Left and one Right ‣ wait for clones to report a path to exit (if it exists) and its length ‣ pick direction that gets you to exit the fastest 20

  20. Example: recursive array_max def array_max(array, n): if n == 1: return array[0] else: return max(array[n-1], array_max(array, n-1)) Activity #1 21

  21. Example: recursive array_max def array_max(array, n): if n == 1: return array[0] else: return max(array[n-1], array_max(array, n-1)) 2 min Activity #1 22

  22. Example: recursive array_max def array_max(array, n): if n == 1: return array[0] else: return max(array[n-1], array_max(array, n-1)) 1 min Activity #1 23

  23. Example: recursive array_max def array_max(array, n): if n == 1: return array[0] else: return max(array[n-1], array_max(array, n-1)) 0 min Activity #1 24

  24. Example: recursive array_max def array_max(array, n): if n == 1: return array[0] else: return max(array[n-1], array_max(array, n-1)) array_max ( [5,1,9,2], 4 ) = [ ] 9 max ( , array_max ( [5,1,9,2], ) = [ ] ) 2 3 9 max ( , array_max ( [5,1,9,2], ) = [ ] ) 9 2 5 max ( , array_max ( [5,1,9,2], ) = [ ] ) 1 1 5 25

  25. Running Time of Recursive Algos ‣ Difficult to analyze :-( ‣ With iterative algorithms ‣ we can count # of ops per loop ‣ How can we count # ops in a recursive step? ‣ We can’t… def factorial(n): def factorial(n): out = 1 if n == 1: for i in range(1, n+1): return 1 out = i * out else: return out return n * factorial(n-1) 26

  26. Recurrence Relations ‣ Functions that express run time recursively T ( n ) = 2 · T ( n − 1) + 10 with T (1) = 8 , | {z } | {z } general case base case ‣ part 1: # of operations in general case ‣ part 2: # of operations in base case 27

  27. Example: recursive array_max def array_max(array, n): if n == 1: return array[0] else: return max(array[n-1], array_max(array, n-1)) T ( n ) = T ( n − 1) + c 1 with T (1) = c 0 What about , | {z } | {z } Big-Oh? general case base case ‣ general: constant # ops for comp & max + cost of recursive call ‣ base: constant # ops for comp and return 28

  28. Big-O from Recurrence Relation ‣ Step #1: Plug & Chug ‣ algebraic manipulations to guess a Big-O expression ‣ Step #2: Induction ‣ prove that Big-O expression is correct 29

  29. Example: recursive array_max T ( n ) = T ( n − 1) + c 1 with T (1) = c 0 , | {z } | {z } general case base case 30

  30. Plug & Chug T ( n ) = T ( n − 1) + c 1 with T (1) = c 0 , | {z } | {z } general case base case T (1) = c 0 T (2) = c 1 + T (1) = c 1 + c 0 T (3) = c 1 + T (2) = c 1 + c 1 + c 0 = 2 c 1 + c 0 T (4) = c 1 + T (3) = c 1 + 2 c 1 + c 0 = 3 c 1 + c 0 = c 1 + 3 c 1 + c 0 = 4 c 1 + c 0 T (5) = c 1 + T (4) … = . . . = . . . T ( n ) = c 1 + T ( n − 1) = ( n − 1) c 1 + c 0 ‣ Closed form expression T ( n ) = ( n − 1) · c 1 + c 0 = O ( n ) 31

  31. Are we done? ‣ That was just a guess…not a proof! ‣ plugged & chugged to find a pattern ‣ and then we guessed at a Big-O ‣ How can we be sure? ‣ We prove it using Induction 32

  32. Induction ‣ Proof technique to prove statements about well-ordered sets ‣ well-ordered: order between elements ‣ example: the integers, recurrence relations ‣ Idea: ‣ prove that the statement P is true for base case ‣ prove that if P is true for some case, then P is true for the next case ‣ Example for integers ‣ prove that a statement P is true for n=1 ‣ prove that if P is true for n=k then P is true for n=k+1 33

  33. Steps to an Inductive Proof Base case ‣ ‣ prove that statement P is true for base case Inductive hypothesis ‣ ‣ assume that P is true for some case n = k Inductive step ‣ ‣ prove that if P is true for n = k then P is true for n = k+1 Conclusion ‣ ‣ Then P must be true for all n 34

  34. Induction Inductive step: Base case:

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend