300 likes | 576 Views
Chapter 14: Recursion. J ava P rogramming: From Problem Analysis to Program Design, Second Edition. Chapter Objectives. Learn about recursive definitions. Explore the base case and the general case of a recursive definition. Learn about recursive algorithms.
E N D
Chapter 14: Recursion JavaProgramming: From Problem Analysis to Program Design, Second Edition
Chapter Objectives • Learn about recursive definitions. • Explore the base case and the general case of a recursive definition. • Learn about recursive algorithms. • Learn about recursive methods. • Become aware of direct and indirect recursion. • Explore how to use recursive methods to implement recursive algorithms. Java Programming: From Problem Analysis to Program Design, Second Edition
Recursive Definitions • Recursion: • Process of solving a problem by reducing it to smaller versions of itself. • Recursive definition: • Definition in which a problem is expressed in terms of a smaller version of itself. • Has one or more base cases. Java Programming: From Problem Analysis to Program Design, Second Edition
Recursive Definitions • Recursive algorithm: • Algorithm that finds the solution to a given problem by reducing the problem to smaller versions of itself. • Has one or more base cases. • Implemented using recursive methods. • Recursive method: • Method that calls itself. • Base case: • Case in recursive definition in which the solution is obtained directly. • Stops the recursion. Java Programming: From Problem Analysis to Program Design, Second Edition
Recursive Definitions • General solution: • Breaks problem into smaller versions of itself. • General case: • Case in recursive definition in which a smaller version of itself is called. • Must eventually be reduced to a base case. Java Programming: From Problem Analysis to Program Design, Second Edition
Tracing a Recursive Method Recursive method: • Has unlimited copies of itself. • Every recursive call has its own: • Code • Set of parameters • Set of local variables Java Programming: From Problem Analysis to Program Design, Second Edition
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. Java Programming: From Problem Analysis to Program Design, Second Edition
Recursive Definitions • Directly recursive: A method that calls itself. • Indirectly recursive: A 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: The case where every recursive call results in another recursive call. Java Programming: From Problem Analysis to Program Design, Second Edition
Designing Recursive Methods • Understand problem requirements. • Determine limiting conditions. • Identify base cases. Java Programming: From Problem Analysis to Program Design, Second Edition
Designing Recursive Methods • Provide direct solution to each base case. • Identify general cases. • Provide solutions to general cases in terms of smaller versions of general cases. Java Programming: From Problem Analysis to Program Design, Second Edition
Recursive Factorial Method public static int fact(int num){if (num = = 0)return 1;elsereturn num * fact(num – 1);} Java Programming: From Problem Analysis to Program Design, Second Edition
Recursive Factorial Method Java Programming: From Problem Analysis to Program Design, Second Edition
Largest Value in Array public static int largest(int[] list, int lowerIndex, int upperIndex) { int max; if(lowerIndex == upperIndex) return list[lowerIndex]; else { max = largest(list, lowerIndex + 1, upperIndex); if(list[lowerIndex] >= max) return list[lowerIndex]; else return max; } } Java Programming: From Problem Analysis to Program Design, Second Edition
Largest Value in Array Java Programming: From Problem Analysis to Program Design, Second Edition
Recursive Fibonacci Java Programming: From Problem Analysis to Program Design, Second Edition
Recursive Fibonacci public static int rFibNum(int a, int b, int n) { if(n = = 1) return a; else if(n = = 2) return b; else return rFibNum(a, b, n -1) + rFibNum(a, b, n - 2); } Java Programming: From Problem Analysis to Program Design, Second Edition
Recursive Fibonacci Java Programming: From Problem Analysis to Program Design, Second Edition
Towers of Hanoi: Three Disk Problem Java Programming: From Problem Analysis to Program Design, Second Edition
Towers of Hanoi: Three Disk Solution Java Programming: From Problem Analysis to Program Design, Second Edition
Towers of Hanoi: Three Disk Solution Java Programming: From Problem Analysis to Program Design, Second Edition
Towers of Hanoi: Recursive Algorithm public static void moveDisks(int count, int needle1, int needle3, int needle2) { if(count > 0) { moveDisks(count - 1, needle1, needle2, needle3); System.out.println("Move disk " + count + " from needle " + needle1 + " to needle " + needle3 + ". "); moveDisks(count - 1, needle2, needle3, needle1); } } Java Programming: From Problem Analysis to Program Design, Second Edition
Recursion or Iteration? • Two ways to solve particular problem: • Iteration • Recursion • Iterative control structures use looping to repeat a set of statements. • Tradeoffs between two options: • Sometimes recursive solution is easier. • Recursive solution is often slower. Java Programming: From Problem Analysis to Program Design, Second Edition
Programming Example: Decimal to Binary public static void decToBin(int num, int base) { if(num > 0) { decToBin(num / base, base); System.out.print(num % base); } } Java Programming: From Problem Analysis to Program Design, Second Edition
Programming Example: Decimal to Binary Java Programming: From Problem Analysis to Program Design, Second Edition
Programming Example: Sierpinski Gasket Java Programming: From Problem Analysis to Program Design, Second Edition
Programming Example:Sierpinski Gasket • Input: Non-negative integer that indicates level of Sierpinski gasket. • Output: Triangle shape that displays a Sierpinski gasket of the given order. • Solution includes: • Recursive method drawSierpinski. • Method to find midpoint of two points. Java Programming: From Problem Analysis to Program Design, Second Edition
Programming Example: Sierpinski Gasket private void drawSierpinski(Graphics g, int lev, Point p1, Point p2, Point p3) { Point midP1P2; Point midP2P3; Point midP3P1; if (lev > 0) { g.drawLine(p1.x, p1.y, p2.x, p2.y); g.drawLine(p2.x, p2.y, p3.x, p3.y); g.drawLine(p3.x, p3.y, p1.x, p1.y); midP1P2 = midPoint(p1, p2); midP2P3 = midPoint(p2, p3); midP3P1 = midPoint(p3, p1); drawSierpinski(g, lev - 1, p1, midP1P2, midP3P1); drawSierpinski(g, lev - 1, p2, midP2P3, midP1P2); drawSierpinski(g, lev - 1, p3, midP3P1, midP2P3); } } Java Programming: From Problem Analysis to Program Design, Second Edition
Programming Example: Sierpinski Gasket Java Programming: From Problem Analysis to Program Design, Second Edition
Chapter Summary • Recursive definitions • Recursive algorithms • Recursive methods • Base cases • General cases Java Programming: From Problem Analysis to Program Design, Second Edition
Chapter Summary • Tracing recursive methods • Designing recursive methods • Varieties of recursive methods • Recursion vs. iteration • Various recursive functions Java Programming: From Problem Analysis to Program Design, Second Edition