CompSci 100E 12.1 Solving Problems Recursively  Recursion is an indispensable tool in a programmer’s toolkit  Allows many complex problems to be solved.

Slides:



Advertisements
Similar presentations
Recursion Ellen Walker CPSC 201 Data Structures Hiram College.
Advertisements

Main Index Contents 11 Main Index Contents Week 10 – Recursive Algorithms.
Chapter 10 Recursion Instructor: alkar/demirer. Copyright ©2004 Pearson Addison-Wesley. All rights reserved.10-2 Recursive Function recursive functionThe.
Recursion Chapter 7. Spring 2010CS 2252 Chapter Objectives To understand how to think recursively To learn how to trace a recursive method To learn how.
Recursion. 2 CMPS 12B, UC Santa Cruz Solving problems by recursion How can you solve a complex problem? Devise a complex solution Break the complex problem.
Fall 2007CS 2251 Recursion Chapter 7. Fall 2007CS 2252 Chapter Objectives To understand how to think recursively To learn how to trace a recursive method.
Chapter 10 Recursion. Copyright © 2005 Pearson Addison-Wesley. All rights reserved Chapter Objectives Explain the underlying concepts of recursion.
28-Jun-15 Recursion. 2 Definitions I A recursive definition is a definition in which the thing being defined occurs as part of its own definition Example:
Chapter 15 Recursive Algorithms. 2 Recursion Recursion is a programming technique in which a method can call itself to solve a problem A recursive definition.
29-Jun-15 Recursion. 2 Definitions I A recursive definition is a definition in which the thing being defined occurs as part of its own definition Example:
Recursion A recursive function is a function that calls itself either directly or indirectly through another function. The problems that can be solved.
Recursion Chapter 7. Chapter 7: Recursion2 Chapter Objectives To understand how to think recursively To learn how to trace a recursive method To learn.
Recursion Chapter 7. Chapter 7: Recursion2 Chapter Objectives To understand how to think recursively To learn how to trace a recursive method To learn.
19-Aug-15 Simple Recursive Algorithms. 2 A short list of categories Algorithm types we will consider include: Simple recursive algorithms Backtracking.
Recursion Chapter 5.
Department of Computer Science and Engineering, HKUST 1 HKUST Summer Programming Course 2008 Recursion.
Recursion Chapter Nature of Recursion t Problems that lend themselves to a recursive solution have the following characteristics: –One or more.
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Chapter 12: Recursion Problem Solving, Abstraction, and Design using C++
A Computer Science Tapestry 1 Recursion (Tapestry 10.1, 10.3) l Recursion is an indispensable technique in a programming language ä Allows many complex.
CMSC 2021 Recursion Recursive Definition – one that defines something in terms of itself Recursion – A technique that allows us to break down a problem.
CompSci 100E 10.1 Solving Problems Recursively  Recursion is an indispensable tool in a programmer’s toolkit  Allows many complex problems to be solved.
Recursion Chapter 7. Chapter Objectives  To understand how to think recursively  To learn how to trace a recursive method  To learn how to write recursive.
CPS 100, Spring From Recursion to Self Reference public int calc(int n){ return n*calc(n-1); } l What is the Internet?  A network of networks.
CompSci 100 Prog Design and Analysis II Sept 16, 2010 Prof. Rodger CompSci 100, Fall
Copyright © 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Java Software Solutions Foundations of Program Design Sixth Edition by Lewis.
Chapter 8 Recursion Modified.
Chapter 13 Recursion. Learning Objectives Recursive void Functions – Tracing recursive calls – Infinite recursion, overflows Recursive Functions that.
Recursion Part 3 CS221 – 2/27/09. Recursion A function calls itself directly: Test() { … Test(); … }
Recursion Recursion Chapter 12. Outline n What is recursion n Recursive algorithms with simple variables n Recursion and the run-time stack n Recursion.
CSIS 123A Lecture 9 Recursion Glenn Stevenson CSIS 113A MSJC.
CompSci 100e 6.1 Hashing: Log ( ) is a big number l Comparison based searches are too slow for lots of data  How many comparisons needed for a.
Compsci 100, Fall From Recursion to Self Reference public int calc(int n){ return n*calc(n-1); } l What is the Internet?  A network of networks.
Data Structures R e c u r s i o n. Recursive Thinking Recursion is a problem-solving approach that can be used to generate simple solutions to certain.
Java Programming: Guided Learning with Early Objects Chapter 11 Recursion.
©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 15 * Recursive Algorithms.
CPS 100, Spring Tools: Solve Computational Problems l Algorithmic techniques  Brute-force/exhaustive, greedy algorithms, dynamic programming,
1 Recursion Recursion is a powerful programming technique that provides elegant solutions to certain problems. Chapter 11 focuses on explaining the underlying.
A Computer Science Tapestry 10.1 Solving Problems Recursively l Recursion is an indispensable tool in a programmer’s toolkit  Allows many complex problems.
CompSci Review of Recursion with Big-Oh  Recursion is an indispensable tool in a programmer’s toolkit  Allows many complex problems to be solved.
CompSci 100E 15.1 What is a Binary Search?  Magic!  Has been used a the basis for “magical” tricks  Find telephone number ( without computer ) in seconds.
CPS Today’s topics Programming Recursion Copyrights, patents, and digital media Reading Great Ideas, p Brookshear, Section Online.
CompSci 100e 7.1 Hashing: Log ( ) is a big number l Comparison based searches are too slow for lots of data  How many comparisons needed for a.
Recursion Chapter 17 Instructor: Scott Kristjanson CMPT 125/125 SFU Burnaby, Fall 2013.
Recursion Fundamentals of Recursion l Base case (aka exit case)  Simple case that can be solved with no further computation  Does not make a recursive.
CPS Solving Problems Recursively l Recursion is an indispensable tool in a programmer’s toolkit  Allows many complex problems to be solved simply.
A Computer Science Tapestry 10.1 Solving Problems Recursively l Recursion is an indispensable tool in a programmer’s toolkit ä Allows many complex problems.
Recursion. What is Recursion? Method of solving problems Alternative to iteration All recursive solutions can be implemented iteratively Characteristic...
1 Recursion Recursive function: a function that calls itself (directly or indirectly). Recursion is often a good alternative to iteration (loops). Its.
chap10 Chapter 10 Recursion chap10 2 Recursive Function recursive function The recursive function is a kind of function that calls.
A Computer Science Tapestry 1 Announcements l Please complete the Course Evaluations l Final exam on December 24, 2015, Thursday ä at 16:00 (more info.
CPS Today’s topics Programming Recursion Invariants Reading Great Ideas, p Brookshear, Section Upcoming Copyrights, patents, and.
Chapter 10 Recursion Instructor: Yuksel / Demirer.
Plan for the Week Review for Midterm Source code provided
Solving Problems Recursively
Recursive Thinking Chapter 9 introduces the technique of recursive programming. As you have seen, recursive programming involves spotting smaller occurrences.
Java Software Structures: John Lewis & Joseph Chase
Announcements Final Exam on August 17th Wednesday at 16:00.
Recursive Thinking Chapter 9 introduces the technique of recursive programming. As you have seen, recursive programming involves spotting smaller occurrences.
Recursion 12-Nov-18.
Recursive Definitions
Chapter 12 Recursion (methods calling themselves)
Recursion 2-Dec-18.
Announcements Final Exam on August 19th Saturday at 16:00.
Announcements Final Exam on December 25th Monday at 16:00.
Announcements HW3 grades will be announced this week
Recursion 23-Apr-19.
Solving Problems Recursively
Solving Problems Recursively
Presentation transcript:

CompSci 100E 12.1 Solving Problems Recursively  Recursion is an indispensable tool in a programmer’s toolkit  Allows many complex problems to be solved simply  Elegance and understanding in code often leads to better programs: easier to modify, extend, verify (and sometimes more efficient!!)  Sometimes recursion isn’t appropriate, when it’s bad it can be very bad---every tool requires knowledge and experience in how to use it  The basic idea is to get help solving a problem from coworkers (clones) who work and act like you do  Ask clone to solve a simpler but similar problem  Use clone’s result to put together your answer  Need both concepts: call on the clone and use the result

CompSci 100E 12.2 Print words entered, but backwards  Can use a vector, store all the words and print in reverse order  The vector is probably the best approach, but recursion works too void printReversed() { // some I/O details omitted String word; word = console.readLine(); if (word.length() > 0) { // get something? printReversed(); // print the rest reversed System.out.println(word); // then print the word } // somewhere in main ---.printReversed();  The function printReversed reads a word, prints the word only after the clones finish printing in reverse order  Each clone has its own version of the code, its own word variable

CompSci 100E 12.3 Exponentiation  Computing x n means multiplying n numbers (or does it?)  What’s the easiest value of n to compute x n ?  If you want to multiply only once, what can you ask a clone? x^n */ double power(double x, int n){ if (n == 0){ return 1.0; } return x * power(x, n-1); }  What about an iterative version?

CompSci 100E 12.4 Faster exponentiation  How many recursive calls are made to computer ?  How many multiplies on each call? Is this better? x^n */ double power(double x, int n){ if (n == 0) { return 1.0; } double semi = power(x, n/2); if (n % 2 == 0) { return semi*semi; } return x * semi * semi; }  What about an iterative version of this function?

CompSci 100E 12.5 Keys to Recursion  Recursive functions have two key attributes  There is a base case, sometimes called the halting or exit case, which does not make a recursive call o See print reversed, exponentiation, factorial for examples  All other cases make a recursive call, with some parameter or other measure that decreases or moves towards the base case o Ensure that sequence of calls eventually reaches the base case o “Measure” can be tricky, but usually it’s straightforward  Example: sequential search in a vector  If first element is search key, done and return  Otherwise look in the “rest of the vector”  How can we recurse on “rest of vector”?

CompSci 100E 12.6 Classic examples of recursion  For some reason, computer science uses these examples:  Factorial: we can use a loop or recursion. Is this an issue?  Fibonacci numbers: 1, 1, 2, 3, 5, 8, 13, 21, … o F(n) = F(n-1) + F(n-2), why isn’t this enough? What’s needed? o Classic example of bad recursion, to compute F(6), the sixth Fibonacci number, we must compute F(5) and F(4). What do we do to compute F(5)? Why is this a problem?  Towers of Hanoi o N disks on one of three pegs, transfer all disks to another peg, never put a disk on a smaller one, only on larger o Every solution takes “forever” when N, number of disks, is large

CompSci 100E 12.7 Fibonacci: Don’t do this recursively n >= 0 n-th Fibonacci * number */ long recFib(int n) { if (0 == n || 1 == n) { return 1; } else { return recFib(n-1) + recFib(n-2); }  How many clones/calls to compute F(5)? How many calls of F(1)? How many total calls? consider caching code

CompSci 100E 12.8 Towers of Hanoi  The origins of the problem may be in the far east  Move n disks from one peg to another with restrictive rules /** disks moved from peg 'from‘ * to peg 'to' using peg 'aux' numDisks on peg # from from source peg # to target peg # aux peg # for parking */ void move(int from, int to, int aux, int numDisks) { if (numDisks == 1) { System.out.println("move " + from + " to " + to ); } else { move(from,aux,to, numDisks - 1); move(from,to,aux, 1); move(aux,to,from, numDisks - 1); } Peg#1 #2 #3

CompSci 100E 12.9 What’s better: recursion/iteration?  There’s no single answer, many factors contribute  Ease of developing code assuming other factors ok  Efficiency (runtime or space) can matter, but don’t worry about efficiency unless you know you have to  In some examples, like Fibonacci numbers, recursive solution does extra work, we’d like to avoid the extra work  Iterative solution is efficient  The recursive inefficiency of “extra work” can be fixed if we remember intermediate solutions: instance variables  Instance variable: maintains value over all function calls  Local variables created each time function called

CompSci 100E Fixing recursive Fibonacci n >= 0 and n <= 30 the n-th Fibonacci number */ long recFib(int n) { long[] mem = new long[31]; Arrays.fill(mem, 0); return recFib(n, mem); } long recFib(int n, long[] mem){ if (0 == n || 1 == n) return 1; else if (mem[n] != 0) return mem[n]; else { mem[n] = recFib(n-1, mem) + recFib(n-2, mem); return mem[n]; }  What does mem do? Why initialize to all zeros?  Note the use of a wrapper method to allow the use of mem  The recursive method has mem as an added parameter

CompSci 100E Thinking recursively  Problem: find the largest element in a vector  Iteratively: loop, remember largest seen so far  Recursive: find largest in [1..n], then compare to 0 th element a contains a.length elements, 0 < a.length maximal element of a */ double max(double[] a) { int k; double max = a[0]; for(k=0; k < a.length; k++) { if (max < a[k]) max = a[k]; } return max; }  In a recursive version what is base case, what is measure of problem size that decreases (towards base case)?

CompSci 100E Recursive Max a contains a.length elements, 0 < a.length first < a.length is index to start maximal element of a[first..length-1] */ double recMax(double[] a, int first) { if (first == a.length-1){ // last element, done return a[first]; } double maxAfter = recMax(a, first+1); if (maxAfter < a[first]) return a[first]; else return maxAfter; }  What is base case (conceptually)?  We can use recMax to implement max as follows return recMax(a,0);

CompSci 100E Recognizing recursion: /** a is changed */ void change(int[] a, int first, int last) { if (first < last) { int temp = a[first]; // swap a[first], a[last] a[first] = a[last]; a[last] = temp; change(a, first+1, last-1); } // original call (why?): change(a, 0, a.length-1);  What is base case? (no recursive calls)  What happens before recursive call made?  How is recursive call closer to the base case?

CompSci 100E More recursion recognition // what does this one do? int value(int[] a, int index) { if (index < a.length) { return a[index] + value(a,index+1); } return 0; } // original call: val = value(a,0);  What is base case, what value is returned?  How is progress towards base case realized?  How is recursive value used to return a value?  What if a is vector of doubles, does anything change?

CompSci 100E Grids, vectors, matrices double[][] grid = new double[20][30]; for(int k=0; k < grid.length; k++){ grid[k][5] = 4.0; }  How is # rows specified? Columns?  How do we set row with index 8 to have value 2.0? { Twenty rows for(int k=0; k < grid[0].length; k++){ grid[8][k] = 2.0; } { Thirty columns

CompSci 100E Blob Counting: Recursion at Work  Blob counting is similar to what’s called Flood Fill, the method used to fill in an outline with a color (use the paint- can in many drawing programs to fill in)  Possible to do this iteratively, but hard to get right  Simple recursive solution  Suppose a slide is viewed under a microscope  Count images on the slide, or blobs in a gel, or …  Erase noise and make the blobs more visible  To talk about this program we’ll used a character bit-map which represents images using characters.

CompSci 100E Counting blobs, the first slide prompt> blobs enter row col size # pixels on: between 1 and 500: | * * * * * * *** * **** * * | | * *** * * *** * * * * * * * * **| | * ** ** * ** * * * *** * * | | * * ***** *** * * ** ** * | |* * *** * ** * * * * * ** | |* * ** * * * * *** ** * | | **** * * ** **** * *** * * **| |** * * * ** **** ** * * ** *|  How many blobs are there? Blobs are connected horizontally and vertically, suppose a minimum of 10 cells in a blob  What if blob size changes?

CompSci 100E Identifying Larger Blobs blob size (0 to exit) between 0 and 50: # blobs = 3  Using a copy of the original character bit-map counts blobs in the copy, by erasing noisy data (essentially)  In identifying blobs, too-small blobs are counted, then uncounted by erasing them

CompSci 100E Identifying smaller blobs blob size (0 to exit) between 0 and 50: # blobs = 8  What might be a problem for this display if there are more than nine blobs?  Issues in looking at code: how do language features get in the way of understanding the code?  How can we track blobs, e.g., find the largest blob?

CompSci 100E Issues that arise in studying code  What does static mean, values defined in Blobs?  Class-wide values rather than stored once per object  All Blob variables would share PIXEL_OFF, unlike normal variables which are different in every object  When is static useful?  How does the matrix work  Two-dimensional array  First index is the row, second index is the column  We’ll study these concepts in more depth, a minimal understanding is needed to work recursive blob find

CompSci 100E Helper functions  process finds blobs of a given size (or larger) in the character bit-map  Blobs are searched for starting from every possible location  If blob is found but is smaller than the cutoff, it is erased from the grid  To find a blob, look at every pixel, if a pixel is part of a blob, identify the entire blob by sending out recursive clones/scouts  Each clone reports back the number of pixels it counts  Each clone “colors” the blob with an identifying mark  The mark is used to avoid duplicate (unending) work

CompSci 100E Conceptual Details of blobFill  Once a blob pixel is found, four recursive clones are “sent out” looking horizontally and vertically, reporting pixel count  How are pixel counts processed by clone-sender?  What if all the clones ultimately report a blob that’s small?  In checking horizontal/vertical neighbors what happens if there aren’t four neighbors? Is this a potential problem?  Who checks for valid pixel coordinates, or pixel color?  Two options: don’t make the call, don’t process the call  Non-recursive methods takes care of looking for blobsign, then filling/counting/unfilling blobs  How is unfill/uncount (erasing a blob) managed?

CompSci 100E Saving blobs  In current version of process the blobs are counted  What changes if we want to store the blobs that are found?  How can clients access the found blobs?  What is a blob, does it have state? Behavior?  What happens when a new minimal blob size is specified?