Recursive Methods and Problem Solving
Transcript of Recursive Methods and Problem Solving
![Page 1: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/1.jpg)
Recursive Methods and Problem Solving
Chris Kiekintveld CS 2401 (Fall 2010)
Elementary Data Structures and Algorithms
![Page 2: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/2.jpg)
Review: Calling Methods
Java Programming: Program Design Including Data Structures 2
int x(int n) { int m = 0; n = n + m + 1; return n;
}
int y(int n) { int m = 1; n = x(n); return m + n;
} What does y(3) return?
![Page 3: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/3.jpg)
Calling Methods
Methods can call other methods Can a method call itself? Yes! This is called a recursive method (function) “A method within a method”
Java Programming: Program Design Including Data Structures 3
![Page 4: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/4.jpg)
Java Programming: Program Design Including Data Structures 4
![Page 5: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/5.jpg)
Example
Java Programming: Program Design Including Data Structures 5
void test(int n) { if (n > 0) { System.out.println(n); test(n-1); System.out.println(n); } }
Trace the execution of test(4)
![Page 6: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/6.jpg)
Example (pt 2)
Java Programming: Program Design Including Data Structures 6
void test(int n) { if (n > 0) { System.out.println(n); test(n-1); System.out.println(n); } }
Trace the execution of test(-4)
![Page 7: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/7.jpg)
Java Programming: Program Design Including Data Structures 7
Terminology
A recursive method is any method that calls itself
Base case VERY IMPORTANT Stops the recursion (prevents infinite loops) Solved directly to return a value without calling the
same method again
![Page 8: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/8.jpg)
Java Programming: Program Design Including Data Structures 8
Recursive Definitions
Directly recursive: method that calls itself
Indirectly recursive: method that calls another method and eventually results in the original method call
Tail recursive method: recursive method in which the last statement executed is the recursive call
Infinite recursion: case where every recursive call results in another recursive call
![Page 9: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/9.jpg)
Tracing a Recursive Method
As always, go line by line Recursive methods may have many copies Every method call creates a new copy and transfers
flow of control to the new copy Each copy has its own:
code parameters local variables
Java Programming: Program Design Including Data Structures 9
![Page 10: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/10.jpg)
Java Programming: Program Design Including Data Structures 10
Tracing a Recursive Method
After completing a recursive call:
Control goes back to the calling environment
Recursive call must execute completely before control goes back to previous call
Execution in previous call begins from point immediately following recursive call
![Page 11: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/11.jpg)
Factorial Numbers
Factorial numbers (i.e., n!) defined recursively: factorial(0) = 1 factorial(n+1) = factorial(n) * n+1
Examples 0! = 1 1! = 1 * 1 = 1 2! = 2 * 1 * 1 = 2 3! = 3 * 2 * 1 * 1 = 6 4! = 4 * 3 * 2 * 1 * 1 = 24
Java Programming: Program Design Including Data Structures 11
![Page 12: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/12.jpg)
Java Programming: Program Design Including Data Structures 12
Iterative Factorial Method
public static int fact(int num) { int tmp = 1; for (int i = 1; i <= num; i++) { tmp *= i; } return tmp; }
Trace fact(5)
![Page 13: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/13.jpg)
Java Programming: Program Design Including Data Structures 13
Recursive Factorial Method
public static int fact(int num) { if (num == 0) return 1; else return num * fact(num – 1); }
Trace fact(5)
![Page 14: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/14.jpg)
Java Programming: Program Design Including Data Structures 14
Recursive Factorial Trace
![Page 15: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/15.jpg)
Java Programming: Program Design Including Data Structures 15
Recursion or Iteration?
Moral: There is usually more than one way to solve a problem! Iteration (loops to repeat code) Recursion (nested function calls to repeat code)
Tradeoffs between two options: Sometimes recursive solution is easier Recursive solution is often slower
![Page 16: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/16.jpg)
Today’s Topic: Recursion (Continued)
Java Programming: Program Design Including Data Structures 16
![Page 17: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/17.jpg)
Facts about Recursion
Recursive methods call themselves Each call solves an identical problem
The code is the same! Successive calls solve smaller/simpler instances
Every recursive algorithm has at least one base case A known/easy to solve case Often, when we reach 1 or 0
Java Programming: Program Design Including Data Structures 17
![Page 18: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/18.jpg)
Designing Recursive Algorithms
General strategy: “Divide and Conquer” Questions to ask yourself
How can we reduce the problem to smaller version of the same problem?
How does each call make the problem smaller? What is the base case? Will you always reach the base case?
Java Programming: Program Design Including Data Structures 18
![Page 19: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/19.jpg)
Similarities
Closely related to recursive definitions in math Also closely related to proof by induction
Inductive proofs work in “reverse” Start by proving a base case Then show that if it is true for case n, it must also be
true for case n+1
Java Programming: Program Design Including Data Structures 19
![Page 20: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/20.jpg)
Exercise
Write a recursive function that prints the numbers 1…n in descending order:
Java Programming: Program Design Including Data Structures 20
public void descending(int n) {
}
![Page 21: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/21.jpg)
Exercise
Write a recursive function that prints the numbers 1…n in descending order:
Java Programming: Program Design Including Data Structures 21
public void descending(int n) { if (n <= 0) return; System.out.println(n); descending(n-1); }
![Page 22: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/22.jpg)
Exercise
Write a recursive function to perform exponentiation return xm, assuming m >= 0
Java Programming: Program Design Including Data Structures 22
public int exp(int x, int m) {
}
![Page 23: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/23.jpg)
Exercise
Write a recursive function to perform exponentiation return xm, assuming m >= 0
Java Programming: Program Design Including Data Structures 23
public int exp(int x, int m) { if (m == 0) { return 1; } if (m == 1) { return x; } return x * exp(x, m-1); }
![Page 24: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/24.jpg)
Java Programming: Program Design Including Data Structures 24
public static boolean p(string s, int i, int f) if (i < f) { if (s[i] == s[f]) { return p(s, i+1, f-1); } else { return false; } } else { return true; } }
What does p(s,0,s.length-1) return a) if s ="UTEP' b) if s ="SAMS' c) if s ="kayak" d) if s= "ABBA"
![Page 25: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/25.jpg)
Towers of Hanoi
The legend of the temple of Brahma 64 golden disks on 3 pegs The universe will end when the priest move all disks
from the first peg to the last
Java Programming: Program Design Including Data Structures 25
![Page 26: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/26.jpg)
The Rules
Only move one disk at a time A move is taking one disk from a peg and putting it
on another peg (on top of any other disks) Cannot put a larger disk on top of a smaller disk With 64 disks, at 1 second per disk, this would take
roughly 585 billion years
Java Programming: Program Design Including Data Structures 26
![Page 27: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/27.jpg)
Java Programming: Program Design Including Data Structures 27
Towers of Hanoi: Three Disk Problem
![Page 28: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/28.jpg)
Java Programming: Program Design Including Data Structures 28
Towers of Hanoi: Three Disk Solution
![Page 29: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/29.jpg)
Java Programming: Program Design Including Data Structures 29
Towers of Hanoi: Three Disk Solution
![Page 30: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/30.jpg)
Four disk solution (courtesy wikipedia)
Java Programming: Program Design Including Data Structures 30
![Page 31: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/31.jpg)
Recursive algorithm idea
Final step is to move the bottom disk from peg 1 to peg 3
To do this, the other n-1 disks must be on peg 2 So, we need an way to move n-1 disks from peg 1 to
peg 2 Base case: moving the smallest disk is easy (you can
always move it to any peg in one step)
Java Programming: Program Design Including Data Structures 31
![Page 32: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/32.jpg)
Pseudocode solveTowers (count, source, destination, spare) { if (count == 1) { move directly } else { solveTowers(count-1, source, spare, destination) solveTowers(1, source, destination, spare) solveTowers(count-1, spare, destination, source) } }
Java Programming: Program Design Including Data Structures 32
![Page 33: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/33.jpg)
Today’s Topic: Recursion (Continued)
Java Programming: Program Design Including Data Structures 33
![Page 34: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/34.jpg)
Java Programming: Program Design Including Data Structures 34
Recursive Fibonacci
![Page 35: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/35.jpg)
Java Programming: Program Design Including Data Structures 35
Recursive Fibonacci (continued)
public static int fib(int n) { if (n <= 2) { return 1; } return fib(n - 1) + fib(n – 2) }
![Page 36: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/36.jpg)
Java Programming: Program Design Including Data Structures 36
Recursive Fibonacci (continued)
![Page 37: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/37.jpg)
Iterative Solution Recursive solution repeats many computations, so it
is very inefficient. An iterative approach:
Java Programming: Program Design Including Data Structures 37
public static int fib(int n) { if (n <= 2) return 1; int f1 = f2 = 1; for (int i = 3; i <= n; i++) { int tmp = f1 + f2; f1 = f2; f2 = tmp; } return f2; }
![Page 38: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/38.jpg)
Improved Recursion
Java Programming: Program Design Including Data Structures 38
int[] cache = new int[n]; public static int fib(int n) {
if (cache[n] <= 0) { cache[n] = fib(n-2) + fib(n-1); } return cache[n]; }
Bugs?
![Page 39: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/39.jpg)
Improved Recursion (debugged)
Java Programming: Program Design Including Data Structures 39
int[] cache = new int[n+1]; public static int fib(int n) { if (n <= 2) return 1; if (cache[n] <= 0) { cache[n] = fib(n-2) + fib(n-1); } return cache[n]; }
![Page 40: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/40.jpg)
Search
Design a method that returns true if element n is a member of array x[] and false if not
Iterative approach:
Java Programming: Program Design Including Data Structures 40
public boolean search(int[] x, int n) { for(int i = 0; i < x.length, i++) { if (x[i] == n]) return true; } return false; }
![Page 41: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/41.jpg)
Recursive Search
A recursive variant:
Java Programming: Program Design Including Data Structures 41
boolean search(int[] x, int size, int n) { if (size > 0) { if (x[size-1] == n) { return true; } else { return search(x, size-1, n); } } return false; }
![Page 42: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/42.jpg)
Faster Search
The problem: these methods are slow Recall the phone book example “Linear search” – need to look at every element “Binary search” is much faster on sorted data
Java Programming: Program Design Including Data Structures 42
![Page 43: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/43.jpg)
Binary Search Pseudocode
search(phonebook, name) { if only one page, scan for the name else open to the middle determine if name is before or after this page if before search (first half of phonebook, name) else search (second half of phonebook, name)
Java Programming: Program Design Including Data Structures 43
![Page 44: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/44.jpg)
boolean binarySearch(int[] x, int start, int end, int n) { if (end < start) return false; int mid = (start+end) / 2; if (x[mid] == n) { return true; } else { if (x[mid] < n) { return search(x, mid+1, end, n); } else { return search(x, start, mid-1, n); } } }
Java Programming: Program Design Including Data Structures 44
![Page 45: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/45.jpg)
Java Programming: Program Design Including Data Structures 45
Programming Example int test(String s, int last) { if (last < 0) { return 0; } if (s.charAt(last) == “0”) { return 2 * test(s, last-1); } return 1 + 2 * test(s, last-1); }
Trace test(“01101”, 4) What does method test do?
![Page 46: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/46.jpg)
Exercise
Write a recursive function convert a decimal number into a binary number, printing the binary number
public static void decToBin(int num){
}
Java Programming: Program Design Including Data Structures 46
![Page 47: Recursive Methods and Problem Solving](https://reader033.fdocuments.net/reader033/viewer/2022051404/5868bef51a28ab52568ba371/html5/thumbnails/47.jpg)
Java Programming: Program Design Including Data Structures 47
Exercise Decimal to Binary
public static void decToBin(int num) { if (num > 0) { decToBin(num / 2); System.out.print(num % 2); } }