Chapter 12 Recursion l l Chapter 12 Basics

Chapter 12 Recursion l l Chapter 12 Basics of Recursion Programming with Recursion Java: an Introduction to Computer Science & Programming - Walter Savitch 1

Overview Recursion: a definition in terms of itself. Recursion in algorithms: l Recursion is a natural approach to some problems » it sounds circular, but in practice it is not l An algorithm is a step-by-step set of rules to solve a problem » it must eventually terminate with a solution l A recursive algorithm uses itself to solve one or more subcases Recursion in Java: l Recursive methods implement recursive algorithms l A recursive method in one whose definition includes a call to itself » a method definition with an invocation of the very method used to define it Chapter 12 Java: an Introduction to Computer Science & Programming - Walter Savitch 2

Recursive methods must eventually terminate A recursive method must have at least one base, or stopping, case. l A base case does not execute a recursive call » it stops the recursion l Each successive call to itself must be a "smaller version of itself" so that a base case is eventually reached » an argument must be made smaller each call so that eventually the base case executes and stops the recursion Chapter 12 Java: an Introduction to Computer Science & Programming - Walter Savitch 3

Example: a recursive algorithm One way to search a phone book (which is an alphabetically ordered list) for a name is with the following recursive algorithm: Search: middle page = (first page + last page)/2 Open the phone book to middle page; If (name is on middle page) then done; //this is the base case else if (name is alphabetically before middle page) last page = middle page//redefine search area to front half Search//recursive call with reduced number of pages else //name must be after middle page first page = middle page//redefine search area to back half Search//recursive call with reduced number of pages Chapter 12 Java: an Introduction to Computer Science & Programming - Walter Savitch 4

Example: a recursive method l Recursion. Demo (Display 12. 1/page 642) is a class to process an integer and print out its digits in words » e. g. entering 123 would produce the output "one two three" l in. Words is the method that does the work of translating an integer to words in. Words definition calls itself: Here is the recursive call Chapter 12 Java: an Introduction to Computer Science & Programming - Walter Savitch 5

Example: a base case l l Each recursive call to in. Words reduces the integer by one digit » it drops out the least significant digit Eventually the argument to in. Words has only digit » the if/else statement finally executes the base case » and the algorithm terminates in. Words definition (repeated from the previous slide): This is the base case for in. Words (it executes when the argument has been reduced to only one digit) Recursive calls to in. Words reduce the argument by one digit (integer division truncates) Chapter 12 Java: an Introduction to Computer Science & Programming - Walter Savitch 6

Recursive versus iterative methods All recursive algorithms/methods can be rewritten without recursion. l Methods rewritten without recursion typically have loops, so they are called iterative methods l Iterative methods generally run faster and use less memory space l So when should you use recursion? » when efficiency is not important and it makes the code easier to understand Chapter 12 Java: an Introduction to Computer Science & Programming - Walter Savitch 8

Pseudocode for handling exceptions A common way of handling exceptions in Java: try { <try something and throw an exception if it fails> } catch(Exception_Class_Name e) { <try again> } Chapter 12 Java: an Introduction to Computer Science & Programming - Walter Savitch 9

Example: code for handling exceptions in Java try { System. out. println("Enter a positive number: "); count = Savitch. In. read. Line. Int(); if(count <= 0) throw new Exception("Input not positive. "); } catch(Exception e) { System. out. println(e. get. Message()); System. out. println("Try again. "); <Start over from the beginning> } There is more than one way to do this in Java code. One way is to use recursion. Chapter 12 Java: an Introduction to Computer Science & Programming - Walter Savitch 10

Example: handling exceptions with recursion l The objective of get. Count is to display get. Count method from class an error message if the user enters a non Count. Down (Display 12. 5/page 659): -positive integer and give the user another chance to enter an acceptable (positive) value get. Count does the following: l l l Reads an entry from the keyboard Throws Nonpositive. Exception* if it is not a positive integer Calls itself in the catch block for Nonpositive. Exception so the user gets another chance to enter a positive integer * See Display 12. 6/page 660 for the definition of nonpositive. Exception Chapter 12 Java: an Introduction to Computer Science & Programming - Walter Savitch 11

The "name in the phone book" problem revisited A recursive solution to the problem was shown in pseudocode on slide 4 and is repeated here: Search: middle page = (first page + last page)/2 Open the phone book to middle page; If (name is on middle page) then done; //this is the base case else if (name is alphabetically before middle page) last page = middle page//redefine search area to front half Search//recursive call with reduced number of pages else //name must be after middle page first page = middle page//redefine search area to back half Search//recursive call with reduced number of pages Chapter 12 Java: an Introduction to Computer Science & Programming - Walter Savitch 12

Binary search algorithm l Searching a list for a particular value is a very common problem » searching is a thoroughly studied topic » sequential and binary are two common search algorithms l Sequential search: inefficient, but easy to understand program l Binary search: more efficient than sequential, but it only works if the list is sorted first! l The pseudocode for the "find the name in the phone book" problem is an example of a binary search » notice that names in a phone book are already sorted so you may use a binary search algorithm Chapter 12 Java: an Introduction to Computer Science & Programming - Walter Savitch 13

Why is it called "binary" search? Compare sequential and binary search algorithms: How many elements are eliminated from the list each time a value is read from the list and it is not the "target" value? Sequential search: each time a value is read from the list and it is not the "target" value, only one item from the list is eliminated Binary search: each time a value is read from the list and it is not the "target" value, half the list is eliminated! That is why it is called binary each unsuccessful test for the target value reduces the remaining search list by 1/2. Chapter 12 Java: an Introduction to Computer Science & Programming - Walter Savitch 14

Example: binary search code l The find method of Array. Searcher (Display 12. 7/pages 664 -5) implements a binary search algorithm l It returns the index of the entry if the target value is found or -1 if it is not found l Compare it to the pseudocode for the "name in the phone book" problem Chapter 12 Java: an Introduction to Computer Science & Programming - Walter Savitch 15

Summary l If a method definition includes an invocation of the very method being defined, the invocation is called a recursive call. l Recursive calls are legal in Java and sometimes can make code easier to read. l To avoid infinite recursion, a recursive method definition should contain two kinds of cases: one or more recursive calls and one or more stopping cases that do not involve any recursive calls. l Recursion can be a handy way to write code that says "if an exception is thrown, then start the whole process over again. " Chapter 12 Java: an Introduction to Computer Science & Programming - Walter Savitch 16
- Slides: 15