120 likes | 230 Views
Recursion. CS-240/CS341. What is recursion?. a function calls itself direct recursion a function calls its invoker indirect recursion. f1. f. f2. Outline of a Recursive Function. function header { if (answer is known) return the answer else
E N D
Recursion CS-240/CS341
What is recursion? • a function calls itself • direct recursion • a function calls its invoker • indirect recursion f1 f f2
Outline of a Recursive Function function header { if (answer is known) return the answer else recursive call to solve a "smaller" problem } base case recursive case
Factorial (n) = n * Factorial (n-1) (for n > 0) Factorial (0) = 1 long factorial (int n) { if (n == 0) return 1; else return n * factorial (n-1); } base case Factorial (n) - recursive
How Recursion Works • a recursive function call is like any other function call • each function call has its own activation record (space for storing parameters and local variables) • created when the function is called • destroyed when the function returns to its caller • activation records are stacked up as recursive calls are made • when the base case is reached the recursion “unwinds”
24 4 6 3 2 2 1 1 1 0 Recursive Call Tree RecFact (4) long factorial (int n) { if (n == 0) return 1; else return n * factorial (n-1); } What happens with factorial (-2)?
long factorial (int n) { long fact =1; for (int i = n; i > 0; i--) fact = fact * i; return fact; } Factorial (n) - iterative Factorial (n) = n * (n-1) * (n-2) * ... * 1 for n > 0 Factorial (0) = 1
Euclid'sAlgorithm • Finds the greatest common divisor of two nonnegative integers that are not both 0 • Recursive definition of gcd algorithm • gcd (a, b) = a (if b is 0) • gcd (a, b) = gcd (b, a % b) (if b != 0) • Write a recursive gcd function • prototype? • implementation?
6 54, 30 30, 24 24, 6 6, 0 6 6 6 Tracing gcd (54, 30) int gcd (int a, int b) { if (b == 0) return a; else return gcd (b, a % b); }
int gcd (int a, int b) { int temp; while (b != 0) { temp = b; b = a % b; a = temp; } return a; } Iterative gcd?
int fib (int n) { if (n <= 1) return n; else return fib (n – 1) + fib (n – 2); } fib (0) = 0 fib (1) = 1 fib (n) = fib (n – 1) + fib (n – 2) (for n >= 2) Another recursive definition Fibonacci numbers are the sequence of integers: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ….
5 5 4 3 2 1 0 1 1 1 0 3 2 1 0 2 2 3 2 1 1 1 1 1 1 0 1 0 1 0 Tracing fib(5)