announcements lecture 6 recursion
play

Announcements Lecture #6: Recursion Computer-Science Mentors (CSM) - PDF document

Announcements Lecture #6: Recursion Computer-Science Mentors (CSM) will be opening section signups tonight (Monday, Jan. 30) at 8pm. Details will appear on Piazza. Starting this Friday, Ill start a series of extra lectures for those


  1. Announcements Lecture #6: Recursion • Computer-Science Mentors (CSM) will be opening section signups tonight (Monday, Jan. 30) at 8pm. Details will appear on Piazza. • Starting this Friday, I’ll start a series of extra lectures for those who want them, 4:30-6:00PM in 306 Soda, covering various topics we don’t have room for. It is completely optional, and is not intended to help you with the course. Sign up for 1 unit of CS198 P/NP under CCN 34691 if interested. To get the unit, attendance required, and a few homeworks. • HW 2 will be released today. Due next Monday. Last modified: Sun Feb 19 15:11:54 2017 CS61A: Lecture #6 1 Last modified: Sun Feb 19 15:11:54 2017 CS61A: Lecture #6 2 Philosophy of Functions (I) Philosophy of Functions (II) • Ideally, the specification (syntactic and semantic) should suffice to Syntactic specification (signature) use the function (i.e., without seeing the body). • There is a separation of concerns here: def sqrt(x): Precondition – The caller (client) is concerned with providing values of x, a, b, """Assuming X >= 0, and c and using the result, but not how the result is computed. returns approximation to square root of X.""" – The implementor is concerned with how the result is computed, but not where x, a, b, and c come from or how the value is used. Postcondition – From the client’s point of view, sqrt is an abstraction from the Semantic specification set of possible ways to compute this result. – We call this particular kind functional abstraction. • Specifies a contract between caller and function implementor. • Programming is largely about choosing abstractions that lead to clear, fast, and maintainable programs. • Syntactic specification gives syntax for calling (number of argu- ments). • Semantic specification tells what it does: – Preconditions are requirements on the caller. – Postconditions are promises from the function’s implementor. Last modified: Sun Feb 19 15:11:54 2017 CS61A: Lecture #6 3 Last modified: Sun Feb 19 15:11:54 2017 CS61A: Lecture #6 4 Philosophy of Functions (III) Philosophy of Functions (IV) • Each function should have exactly one, logically coherent and well • Corollary of DRY: Make functions general defined job. – copy-paste leads to maintenance headaches – Intellectual manageability. • Taking two (nearly) repeated sections of program code and turning – Ease of testing. them into calls to a common function is an example of refactoring . • Functions should be properly documented, either by having names • Keep names of functions and parameters meaningful: (and parameter names) that are unambiguously understandable, or Instead of Use by having comments (docstrings in Python) that accurately describe boolean turn is over them. d dice – Should be able to understand code that calls a function without helper take turn reading the body of the function. • Don’t Repeat Yourself ( DRY ). (Bowling example From Kernighan&Plauger): y score – Simplifies revisions. L ball – Isolates problems. f frame Last modified: Sun Feb 19 15:11:54 2017 CS61A: Lecture #6 5 Last modified: Sun Feb 19 15:11:54 2017 CS61A: Lecture #6 6

  2. Simple Linear Recursions (Review) Tail Recursion • We’ve been dealing with recursive function (those that call them- • We’ve also seen a special kind of linear recursion that is strongly selves, directly or indirectly) for a while now. linked to iteration: • From Lecture #3: def sum squares(N): def sum squares(N): def sum squares(N): """The sum of K**2 """The sum of K**2 """The sum of K**2 for K from 1 to N (inclusive).""" for 1 <= K <= N.""" for 1 <= K <= N.""" if N < 1: accum = 0 def part sum(k, accum): return 0 k = 1 if k <= N: else: while k <= N: return part sum(k+1, accum + k**2) return N**2 + sum squares(N - 1) accum += k**2 else: k += 1 return accum • This is a simple linear recursion , with one recursive call per function return accum part sum(1, 0) instantiation. • The right version is a tail-recursive function : the recursive call is • Can imagine a call as an expansion: either the returned value or very last action performed. sum squares(3) => 3**2 + sum squares(2) • The environment frames correspond to the iterations of the loop on => 3**2 + 2**2 + sum squares(1) the left, as shown here. => 3**2 + 2**2 + 1**2 + sum squares(0) => 3**2 + 2**2 + 1**2 + 0 => 14 • Each call in this expansion corresponds to an environment frame, linked to the global frame, as shown here. Last modified: Sun Feb 19 15:11:54 2017 CS61A: Lecture #6 7 Last modified: Sun Feb 19 15:11:54 2017 CS61A: Lecture #6 8 Recursive Thinking Recursive Thinking in Mathematics • So far in this lecture, I’ve shown recursive functions by tracing or • To prevent an infinite recursion, must use this technique only when repeated expansion of their bodies. – The recursive cases are “smaller” than the input case, and • But when you call a function from the Python library, you don’t look – There is a minimum “size” to the data, and at its implementation, just its documentation (“the contract”). – All chains of progressively smaller cases reach a minimum in a • Recursive thinking is the extension of this same discipline to func- finite number of steps. tions as you are defining them. • We say that such “smaller than” relations are well founded . • When implementing sum squares , we reason as follows: • We have – Base case: We know the answer is 0 if there is nothing to sum Theorem (Noetherian Induction): Suppose ≺ is a well-founded ( N < 1 ). relation and P is some property (predicate) such that when- – Otherwise, we observe that the answer is N 2 plus the sum of the ever P ( y ) is true for all y ≺ x , then P ( x ) is also true. Then positive integers from 1 to N − 1 . P ( x ) is true for all x . – But there is a function ( sum squares ) that can compute 1 + . . . + (After Emmy Noether 1882–1935, G ¨ o ttingen and Bryn Mawr). N − 1 (its comment says so). • More general than the “line of dominos” induction you may have en- – So when N ≥ 1 , we should return N 2 + sum squares ( N − 1) . countered: If true for a base case b , and if true for k when true for • This “recursive leap of faith” works as long as we can guarantee we’ll k − 1 , then true for all k > b . hit the base case. Last modified: Sun Feb 19 15:11:54 2017 CS61A: Lecture #6 9 Last modified: Sun Feb 19 15:11:54 2017 CS61A: Lecture #6 10 A Problem Subproblems and Self-Similarity def find first(start, pred): • Recursive routines arise when solving a problem naturally involves """Find the smallest k >= START such that PRED(START).""" solving smaller instances of the same problem. ? • A classic example where the subproblems are visible is Sierpinski’s Triangle (aka bit Sierpinski’s Gasket). • This triangle may be formed by repeatedly replacing a figure, ini- tially a solid triangle, with three quarter-sized images of itself (1/2 size in each dimension), arranged in a triangle: • Or we can think creating a “triangle of order N and size S ” by draw- ing either – a solid triangle with side S if N = 0 , or – three triangles of size S/ 2 and order N − 1 arranged in a triangle. Last modified: Sun Feb 19 15:11:54 2017 CS61A: Lecture #6 11 Last modified: Sun Feb 19 15:11:54 2017 CS61A: Lecture #6 12

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