return return statements
play

Return Return Statements A return statement completes the - PowerPoint PPT Presentation

Return Return Statements A return statement completes the evaluation of a call expression and provides its value f(x) for user-defined function f : switch to a new environment; execute f's body return statement within f : switch back to the


  1. Return

  2. Return Statements A return statement completes the evaluation of a call expression and provides its value f(x) for user-defined function f : switch to a new environment; execute f's body return statement within f : switch back to the previous environment; f(x) now has a value Only one return statement is ever executed while executing the body of a function def end (n, d): """Print the final digits of N in reverse order until D is found. >>> end(34567, 5) 7 6 5 """ while n > 0 : last, n = n % 10 , n // 10 print(last) if d == last: return None (Demo) 2

  3. Recursive Functions

  4. Recursive Functions Definition : A function is called recursive if the body of that function calls itself, either directly or indirectly Implication : Executing the body of a recursive function may require applying that function Drawing Hands, by M. C. Escher (lithograph, 1948) 4

  5. Digit Sums 2+0+1+8 = 11 • If a number a is divisible by 9, then sum_digits(a) is also divisible by 9 • Useful for typo detection! The Bank of 61A A checksum digit is a function of all the other 1234 5678 9098 7658 digits; It can be computed to detect typos OSKI THE BEAR • Credit cards actually use the Luhn algorithm, which we'll implement after sum_digits 5

  6. The Problem Within the Problem The sum of the digits of 6 is 6. Likewise for any one-digit (non-negative) number (i.e., < 10). The sum of the digits of 2019 is 201 9 Sum of these digits + This digit That is, we can break the problem of summing the digits of 2019 into a smaller instance of the same problem, plus some extra stuff. We call this recursion 6

  7. Sum Digits Without a While Statement def split(n): """Split positive n into all but its last digit and its last digit.""" return n // 10, n % 10 def sum_digits(n): """Return the sum of the digits of positive integer n.""" if n < 10: return n else: all_but_last, last = split(n) return sum_digits(all_but_last) + last 7

  8. The Anatomy of a Recursive Function • The def statement header is similar to other functions • Conditional statements check for base cases • Base cases are evaluated without recursive calls • Recursive cases are evaluated with recursive calls def sum_digits(n): """Return the sum of the digits of positive integer n.""" if n < 10: return n else: all_but_last, last = split(n) return sum_digits(all_but_last) + last (Demo1) 8

  9. Recursion in Environment Diagrams

  10. Recursion in Environment Diagrams (Demo2 pythontutor) • The same function fact is called multiple times • Different frames keep track of the different arguments in each call • What n evaluates to depends upon the current environment • Each call to fact solves a simpler problem than the last: smaller n 10 http://pythontutor.com/composingprograms.html#code=def%20fact%28n%29%3A%0A%20%20%20%20if%20n%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20return%201%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20return%20n%20*%20fact%28n%20-%201%29%0A%20%20%20%20%20%20%20%20%0Afact%283%29&cumulative=true&curInstr=0&mode=display&origin=composingprograms.js&py=3&rawInputLstJSON=%5B%5D

  11. Iteration vs Recursion Iteration is a special case of recursion Using while: Using recursion: def fact_iter (n): def fact (n): total, k = 1 , 1 if n == 0 : while k <= n: return 1 total, k = total*k, k+ 1 else : return total return n * fact(n- 1 ) Math: Names: n, total, k, fact_iter n, fact 11 (Demo3 trace!)

  12. Verifying Recursive Functions

  13. The Recursive Leap of Faith def fact ( n ): if n == 0 : return 1 else : return n * fact(n-1) Is fact implemented correctly? 1. Verify the base case 2. Treat fact as a functional abstraction! 3. Assume that fact ( n -1) is correct 4. Verify that fact ( n ) is correct 13 Photo by Kevin Lee, Preikestolen, Norway

  14. Mutual Recursion

  15. The Luhn Algorithm Used to verify credit card numbers From Wikipedia: http://en.wikipedia.org/wiki/Luhn_algorithm • First: From the rightmost digit, which is the check digit, moving left, double the value of every second digit; if product of this doubling operation is greater than 9 (e.g., 7 * 2 = 14), then sum the digits of the products (e.g., 10: 1 + 0 = 1, 14: 1 + 4 = 5) • Second: Take the sum of all the digits 1 3 8 7 4 3 = 30 2 3 1+6=7 7 8 3 The Luhn sum of a valid credit card number is a multiple of 10 (Demo4) 15

  16. Recursion and Iteration

  17. Converting Recursion to Iteration Can be tricky: Iteration is a special case of recursion. Idea: Figure out what state must be maintained by the iterative function. def sum_digits(n): """Return the sum of the digits of positive integer n.""" if n < 10: return n else: all_but_last, last = split(n) return sum_digits(all_but_last) + last A partial sum What's left to sum (Demo5) 17

  18. Converting Iteration to Recursion More formulaic: Iteration is a special case of recursion. Idea: The state of an iteration can be passed as arguments. def sum_digits_iter(n): digit_sum = 0 while n > 0: n, last = split(n) Updates via assignment become... digit_sum = digit_sum + last return digit_sum def sum_digits_rec(n, digit_sum): if n == 0: ...arguments to a recursive call return digit_sum else: n, last = split(n) return sum_digits_rec(n, digit_sum + last) 18

  19. Order of Recursive Calls

  20. The Cascade Function (OPT Demo) • Each cascade frame is from a different call to cascade. • Until the Return value appears, that call has not completed. • Any statement can appear before or after the recursive call. 20 =def%20cascade%28n%29%3A%20%20%20%20%0A%20%20%20%20if%20n%20%3C%2010%3A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20print%28n%29%20%20%20%20%0A%20%20%20%20else%3A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20print%28n%29%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20cascade%28n//10%29%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20print%28n%29%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%0Acascade%28123%29&cumulative=

  21. Two Definitions of Cascade (Demo, clean up cascade) def cascade(n): def cascade(n): if n < 10: print(n) print(n) if n >= 10: else: cascade(n//10) print(n) print(n) cascade(n//10) print(n) If two implementations are equally clear, then shorter is usually better • In this case, the longer implementation is more clear (at least to me) • When learning to write recursive functions, put the base cases first • Both are recursive functions, even though only the first has typical structure • 21

  22. Example: Inverse Cascade

  23. Inverse Cascade Write a function that prints an inverse cascade: def inverse_cascade(n): 1 1 grow(n) 12 12 print(n) 123 123 1234 1234 shrink(n) 123 123 def f_then_g(f, g, n): 12 12 if n: 1 1 f(n) g(n) grow = lambda n: f_then_g(grow, print, n//10) shrink = lambda n: f_then_g(print, shrink, n//10) 23

  24. Tree Recursion

  25. Tree Recursion Tree-shaped processes arise whenever executing the body of a recursive function makes more than one recursive call n: 0, 1, 2, 3, 4, 5, 6, 7, 8, ... , 35 fib(n): 0, 1, 1, 2, 3, 5, 8, 13, 21, ... , 9,227,465 def fib (n): if n == 0 : return 0 elif n == 1 : return 1 else : return fib(n- 2 ) + fib(n- 1 ) 25 http://en.wikipedia.org/wiki/File:Fibonacci.jpg

  26. A Tree-Recursive Process The computational process of fib evolves into a tree structure fib(5) fib(3) fib(4) fib(1) fib(2) fib(2) fib(3) fib(0) fib(1) 1 fib(0) fib(1) fib(1) fib(2) 0 1 fib(0) fib(1) 0 1 1 0 1 (Demo3) 26

  27. Repetition in Tree-Recursive Computation This process is highly repetitive; fib is called on the same argument multiple times fib(5) fib(3) fib(4) fib(1) fib(2) fib(2) fib(3) fib(0) fib(1) 1 fib(0) fib(1) fib(1) fib(2) 0 1 fib(0) fib(1) 0 1 1 0 1 (We will speed up this computation dramatically in a few weeks by remembering results) 27

  28. Example: Counting Partitions

  29. Counting Partitions The number of partitions of a positive integer n, using parts up to size m, is the number of ways in which n can be expressed as the sum of positive integer parts up to m in increasing order. count_partitions(6, 4) 2 + 4 = 6 1 + 1 + 4 = 6 3 + 3 = 6 1 + 2 + 3 = 6 1 + 1 + 1 + 3 = 6 2 + 2 + 2 = 6 1 + 1 + 2 + 2 = 6 1 + 1 + 1 + 1 + 2 = 6 1 + 1 + 1 + 1 + 1 + 1 = 6 29

  30. Counting Partitions The number of partitions of a positive integer n, using parts up to size m, is the number of ways in which n can be expressed as the sum of positive integer parts up to m in non- decreasing order. count_partitions(6, 4) • Recursive decomposition: finding simpler instances of the problem. • Explore two possibilities: • Use at least one 4 • Don't use any 4 • Solve two simpler problems: • count_partitions(2, 4) • count_partitions(6, 3) • Tree recursion often involves exploring different choices. 30

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