120 likes | 236 Vues
Recursion is a programming technique where a function calls itself to solve smaller instances of a problem. This article explores direct and indirect recursion, detailing factors like function calls, base cases, and recursive cases. Using examples such as the computation of factorials and the greatest common divisor (GCD) through Euclid's algorithm, we demonstrate how recursive functions operate and the implications in terms of call stacks and activation records. Additionally, we cover Fibonacci numbers and iterative solutions for better understanding.
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)