180 likes | 282 Views
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
E N D
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 • 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
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) :
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! =
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) :
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) =
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(); }
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.
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); } }
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); } }
Recursive Java Programs • A Similar Method: public static void TwoNBlankLines(int n) { if (n > 0) { System.out.println(); TwoNBlankLines(n-1); System.out.println(); } }
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(); } }
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(); } }
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! =
Another Version: public static int fact (int n) { if (n==1) return 1; Basis Case else return n*fact (n-1); Recursive Case }
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) =
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); }
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?