Presentation is loading. Please wait.

Presentation is loading. Please wait.

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

Similar presentations


Presentation on theme: "1 Recursion Recursive definitions Recursive methods Run-time stack & activation records => Read section 2.3."— Presentation transcript:

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

2 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 3 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) : Recursive Definitions

4 4 Factorial - Recursive Definition: 1if N=1Basis Case N * (N-1)!if N>=2Recursive 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! = { Recursive Definitions

5 5 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) : Recursive Definitions

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

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

8 8 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. Recursive Java Programs

9 9 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); } Recursive Java Programs

10 10 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); } } Recursive Java Programs

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

12 12 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(); } } Recursive Java Programs

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

14 14 Recursive Factorial Definition: 1if N=1Basis Case N * (N-1)!if N>=2Recursive 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 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 16 Recursive Fibonacci Definition: 0if N=1Basis Case 1if N=2Basis Case fib(N-1) + fib(N-2)if N>=3Recursive 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 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 18 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? Recursion & the Run-time Stack


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

Similar presentations


Ads by Google