objectives
play

Objectives become familiar with the idea of recursion learn to - PDF document

Objectives become familiar with the idea of recursion learn to use recursion as a programming tool Recursion become familiar with the binary search algorithm as an example of recursion Chapter 11 become familiar with the merge


  1. Objectives • become familiar with the idea of recursion • learn to use recursion as a programming tool Recursion • become familiar with the binary search algorithm as an example of recursion Chapter 11 • become familiar with the merge sort algorithm as an example of recursion One Possible Way Search : middle page = (first page + last page)/2 How do you look up a name in Go to middle page; If (name is on middle page) the phone book? 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 //same process on reduced number of pages else //name must be after middle page first page = middle page //redefine search area to back half Search //same process on reduced number of pages Recursive Methods Overview Must Eventually Terminate Recursion : a definition in terms of itself. A recursive method must have at least one base, or stopping, case. Recursion in algorithms: • Natural approach to some (not all) problems • A base case does not execute a recursive call • A recursive algorithm uses itself to solve one or more – stops the recursion smaller identical problems • Each successive call to itself must be a "smaller Recursion in Java: version of itself” – an argument that describes a smaller problem • Recursive methods implement recursive algorithms – a base case is eventually reached • A recursive method includes a call to itself 1

  2. Key Components of a Recursive Examples in Recursion Algorithm Design 1. What is a smaller identical problem(s)? • Usually quite confusing the first time � Decomposition • Start with some simple examples 2. How are the answers to smaller problems combined to – recursive algorithms might not be best form the answer to the larger problem? • Later with inherently recursive algorithms � Composition – harder to implement otherwise 3. Which is the smallest problem that can be solved easily (without further decomposition)? � Base/stopping case Factorial ( N !) factorial Method • N ! = ( N -1)! * N [for N > 1] • 1! = 1 public static int factorial(int n) • 3! { = 2! * 3 int fact; = (1! * 2) * 3 if (n > 1) // recursive case (decomposition) fact = factorial(n – 1) * n; // composition = 1 * 2 * 3 else // base case • Recursive design: fact = 1; – Decomposition: ( N -1)! – Composition: * N return fact; } – Base case: 1! public static int factorial(int 3) public static int factorial(int 3) { { int fact; int fact; if (n > 1) if (n > 1) fact = factorial(2) * 3; fact = factorial(2) * 3; else else fact = 1; fact = 1; return fact; return fact; } } public static int factorial(int 2) { int fact; if (n > 1) fact = factorial(1) * 2; else fact = 1; return fact; } 2

  3. public static int factorial(int 3) public static int factorial(int 3) { { int fact; int fact; if (n > 1) if (n > 1) fact = factorial(2) * 3; fact = factorial(2) * 3; else else fact = 1; fact = 1; return fact; return fact; } } public static int factorial(int 2) public static int factorial(int 2) { { int fact; int fact; if (n > 1) if (n > 1) fact = factorial(1) * 2; fact = factorial(1) * 2; else else fact = 1; fact = 1; return fact; return fact; } } public static int factorial(int 1) public static int factorial(int 1) { { int fact; int fact; if (n > 1) if (n > 1) fact = factorial(n - 1) * n; fact = factorial(n - 1) * n; else else fact = 1; fact = 1; return fact; return 1 ; } } public static int factorial(int 3) public static int factorial(int 3) { { int fact; int fact; if (n > 1) if (n > 1) fact = factorial(2) * 3; fact = factorial(2) * 3; else else fact = 1; fact = 1; return fact; return fact; } } public static int factorial(int 2) public static int factorial(int 2) { { int fact; int fact; if (n > 1) if (n > 1) fact = 1 * 2; fact = 1 * 2; else else fact = 1; fact = 1; return fact; return 2 ; } } public static int factorial(int 1) { int fact; if (n > 1) fact = factorial(n - 1) * n; else fact = 1; return 1 ; } public static int factorial(int 3) public static int factorial(int 3) { { int fact; int fact; if (n > 1) if (n > 1) fact = 2 * 3; fact = 2 * 3; else else fact = 1; fact = 1; return fact; return 6; } } public static int factorial(int 2) { int fact; if (n > 1) fact = 1 * 2; else fact = 1; return 2 ; } 3

  4. public static int factorial(int n) public static int factorial(int n) { { Execution Trace Execution Trace int fact; int fact; if (n > 1) // recursive case (decomposition) if (n > 1) // recursive case (decomposition) fact = factorial(n – 1) * n; (composition) fact = factorial(n – 1) * n; (composition) (decomposition) (decomposition) else // base case else // base case fact = 1; fact = 1; return fact; return fact; } } factorial(4) factorial(4) factorial(3) 4 factorial(3) 4 factorial(2) 3 public static int factorial(int n) public static int factorial(int n) { { Execution Trace Execution Trace int fact; int fact; if (n > 1) // recursive case (decomposition) if (n > 1) // recursive case (decomposition) fact = factorial(n – 1) * n; (composition) fact = factorial(n – 1) * n; (composition) (decomposition) (composition) else // base case else // base case fact = 1; fact = 1; return fact; return fact; } } factorial(4) factorial(4) * factorial(3) 4 factorial(3) 4 * factorial(2) 3 factorial(2) 3 * factorial(1)->1 2 factorial(1) 2 public static int factorial(int n) public static int factorial(int n) { { Execution Trace Execution Trace int fact; int fact; if (n > 1) // recursive case (decomposition) if (n > 1) // recursive case (decomposition) (composition) fact = factorial(n – 1) * n; (composition) (composition) fact = factorial(n – 1) * n; (composition) else // base case else // base case fact = 1; fact = 1; return fact; return fact; } } factorial(4) factorial(4) * * factorial(3) 4 factorial(3)->6 4 * factorial(2)->2 3 4

  5. public static int factorial(int n) { Execution Trace int fact; if (n > 1) // recursive case (decomposition) fact = factorial(n – 1) * n; (composition) (composition) Improved factorial Method else // base case fact = 1; return fact; } public static int factorial(int n) factorial(4)->24 { int fact=1; // base case value if (n > 1) // recursive case (decomposition) fact = factorial(n – 1) * n; // composition // else do nothing; base case return fact; } fibonacci Method Fibonacci Numbers public static int fibonacci(int n) • The N th Fibonacci number is the sum of the previous { two Fibonacci numbers int fib; • 0, 1, 1, 2, 3, 5, 8, 13, … if (n > 2) • Recursive Design: fib = fibonacci(n-1) + fibonacci(n-2); – Decomposition & Composition else if (n == 2) • fibonacci(n) = fibonacci(n-1) + fibonacci(n-2) fib = 1; – Base case: else • fibonacci(1) = 0 fib = 0; • fibonacci(2) = 1 return fib; } Execution Trace (decomposition) Execution Trace (decomposition) fibonacci(4) fibonacci(4) fibonacci(3) fibonacci(2) fibonacci(3) fibonacci(2) fibonacci(2) fibonacci(1) 5

  6. Execution Trace (composition) Execution Trace (composition) fibonacci(4) fibonacci(4) + + fibonacci(2) fibonacci(2)->1 fibonacci(3) fibonacci(3)->1 + fibonacci(2)->1 fibonacci(1)->0 Remember : Execution Trace (composition) Key to Successful Recursion • if-else statement (or some other branching fibonacci(4)->2 statement) • Some branches: recursive call – "smaller" arguments or solve "smaller" versions of the same task ( decomposition ) – Combine the results ( composition ) [if necessary] • Other branches: no recursive calls – stopping cases or base cases Template Template (only one base case) … method(…) … method(…) { { … result = … ;//base case if ( … )// base case { if ( … ) // not base case } { //decomposition & composition else // decomposition & composition result = … { } } return … ; // if not void method return result; } } 6

  7. What Happens Here? What Happens Here? public static int factorial(int n) { public static int factorial(int n) int fact=1; { return factorial(n – 1) * n; if (n > 1) } fact = factorial(n) * n; return fact; } Warning: Infinite Recursion May Mistakes in recursion Cause a Stack Overflow Error • Infinite Recursion • No composition -> ? – Problem not getting smaller (no/bad decomposition) • Bad composition -> ? – Base case exists, but not reachable (bad base case and/or decomposition) – No base case • Stack: keeps track of recursive calls by JVM (OS) – Method begins: add data onto the stack – Method ends: remove data from the stack • Recursion never stops; stack eventually runs out of space – Stack overflow error Number of Zeros in a Number numberOfZeros Recursive Design • numberOfZeros in the number N • Example: 2030 has 2 zeros • K = number of digits in N • If n has two or more digits recursive • Decomposition: – the number of zeros is the number of zeros in n with the – numberOfZeros in the first K - 1 digits last digit removed – Last digit – plus an additional 1 if the last digit is zero • Composition: • Examples: – Add: – number of zeros in 20030 is number of zeros in 2003 • numberOfZeros in the first K - 1digits plus 1 • 1 if the last digit is zero – number of zeros in 20031 is number of zeros in 2003 • Base case: plus 0 – N has one digit ( K = 1) 7

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