1 / 18

Recursion

Recursion. Recursive definitions Recursive methods Run-time stack & activation records => Read section 2.3. Recursion is a math and programming tool Technically, not necessary Wasn’t available in early programming languages Advantages of recursion

Télécharger la présentation

Recursion

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Recursion Recursive definitions Recursive methods Run-time stack & activation records => Read section 2.3

  2. Recursion is a math and programming tool • Technically, not necessary • Wasn’t available in early programming languages • Advantages of recursion • Some things are very easy to do with it, but difficult to do without it • Frequently results in very short programs/algorithms • Disadvantages of recursion • Somewhat difficult to understand at first • Often times less efficient than non-recursive counterparts • Presents new opportunities for errors and misunderstanding • Tempting to use, even when not necessary • Recommendation – use with caution, and only if helpful

  3. Recursive Definitions • Factorial – Non-recursive Definition: N! = N * (N-1) * (N-2) * … * 2 * 1 *Note that a corresponding Java program is easy to write public static int fact(int n) :

  4. Recursive Definitions • Factorial - Recursive Definition: 1 if N=1 Basis Case N * (N-1)! if N>=2 Recursive Case Why is it called recursive? Why do we need a basis case? Note that the “recursive reference” is always on a smaller value. { N! =

  5. Recursive Definitions • Fibonacci - Non-Recursive Definition: 0 1 1 2 3 5 8 13 21 34 … *Note that a corresponding Java program is easy to write…or is it? public static int fib(int n) :

  6. Recursive Definitions • Fibonacci - Recursive Definition: 0 if N=1 Basis Case 1 if N=2 Basis Case fib(N-1) + fib(N-2) if N>=3 Recursive Case Note there are two basis cases and two recursive references. { fib(N) =

  7. Recursive Java Programs • Printing N Blank Lines – Non-Recursive: public static void NBlankLines(int n) { for (int i=1; i<=n; i++) System.out.println(); }

  8. Recursive Java Programs • Printing N Blank Lines – Recursive: // NBlankLines outputs n blank lines, for n>=0 public static void NBlankLines(int n) { if (n <= 0) Basis Case return; else { System.out.println(); NBlankLines(n-1); Recursive Case } } *Don’t ever write it this way; this is a simple, first example of recursion.

  9. Recursive Java Programs • Another Equivalent Version (slightly restructured): // NBlankLines outputs n blank lines, for n>=0 public static void NBlankLines(int n) { if (n > 0) { System.out.println(); NBlankLines(n-1); } }

  10. Recursive Java Programs public static void main(String[] args) { : NBlankLines(3); : } public static void NBlankLines(int n) { n=3 if (n > 0) { System.out.println(); NBlankLines(n-1); } } public static void NBlankLines(int n) { n=2 if (n > 0) { System.out.println(); NBlankLines(n-1); } } public static void NBlankLines(int n) { n=1 if (n > 0) { System.out.println(); NBlankLines(n-1); } } public static void NBlankLines(int n) { n=0 if (n > 0) { System.out.println(); NBlankLines(n-1); } }

  11. Recursive Java Programs • A Similar Method: public static void TwoNBlankLines(int n) { if (n > 0) { System.out.println(); TwoNBlankLines(n-1); System.out.println(); } }

  12. Recursive Java Programs public static void main(String[] args) { : TwoNBlankLines(2); : } public static void TwoNBlankLines(int n) { n=2 if (n > 0) { System.out.println(); TwoNBlankLines(n-1); System.out.println(); } } public static void TwoNBlankLines(int n) { n=1 if (n > 0) { System.out.println(); TwoNBlankLines(n-1); System.out.println(); } } public static void TwoNBlankLines(int n) { n=0 if (n > 0) { System.out.println(); TwoNBlankLines(n-1); System.out.println(); } }

  13. Are the Following Methods the Same or Different? public static void TwoNBlankLines(int n) { if (n > 0) { System.out.println(); System.out.println(); TwoNBlankLines(n-1); } } public static void TwoNBlankLines(int n) { if (n > 0) { TwoNBlankLines(n-1); System.out.println(); System.out.println(); } }

  14. Recursive Factorial Definition: 1 if N=1 Basis Case N * (N-1)! if N>=2 Recursive Case • Recursive Factorial Program: public static int fact (int n) { if (n==1) return 1; Basis Case else { int x; Recursive Case x = fact (n-1); return x*n; } } { N! =

  15. Another Version: public static int fact (int n) { if (n==1) return 1; Basis Case else return n*fact (n-1); Recursive Case }

  16. Recursive Fibonacci Definition: 0 if N=1 Basis Case 1 if N=2 Basis Case fib(N-1) + fib(N-2) if N>=3 Recursive Case • Recursive Fibonacci Program: public static int fib (int n) { if (n==1) return 0; Basis Case else if (n==2) return 1; Basis Case else { int x,y; Recursive Case x = fib (n-1); y = fib (n-2); return x+y; } } { fib(N) =

  17. Another Version: public static int fib (int n) { if (n==1) return 0; else if (n==2) return 1; else return fib(n-1) + fib(n-2); }

  18. Recursion & the Run-time Stack • How does recursion related to stack frames and the run time stack? • Note that stack frames are sometimes called allocation records or activation records • Why might a recursive program be less efficient than non-recursive counterpart? • Why is the recursive fibonnaci function especially inefficient?

More Related