Presentation is loading. Please wait.

Presentation is loading. Please wait.

Introduction to Recursion CSCI 3333 Data Structures.

Similar presentations


Presentation on theme: "Introduction to Recursion CSCI 3333 Data Structures."— Presentation transcript:

1 Introduction to Recursion CSCI 3333 Data Structures

2 Acknowledgement  Dr. Bun Yue  Mr. Charles Moen  Dr. Wei Ding  Ms. Krishani Abeysekera  Dr. Michael Goodrich  Dr. Behrouz A. Forouzan  Dr. Richard F. Gilberg

3 Recursion  Recursion is defining a function that calls itself as a subroutine.  Recursion is a way to combat complexity and solve problems.  Solving a problem by: Solving the problem for ‘trivial’ cases, and Solving the same problem, but with smaller sizes.

4 Recursive Definition  A recursive definition: a definition in terms of itself. Example:  0 is a natural number.  If x is a natural number, then x+1 is a natural number. (or x is a natural number if x-1 is a natural number).

5 Recursive Methods  A recursive method may calls itself. Example: factorial. Iterative definition: n! = n. (n-1). (n-2) … 3. 2. 1 Recursive definition:

6 Recursive Factorial Algorithm //By Forouzan

7 Factorial Implementation: Fac-1  Found here in C++:here int factorial(int number) { int temp; if (number <= 1) return 1; temp = number * factorial(number - 1); return temp; }  What do you think?

8 Another Implementation: Fac-2 int recursiveFactorial(int n) { if ( n == 0 ) return 1 ; // base case else return n * recursiveFactorial ( n- 1 ); // recursive case /general case }

9 Content of a Recursive Method  Base case(s): exit conditions Values of the input variables (exit conditions) for which we perform no recursive calls are called base cases (there should be at least one base case). Every possible chain of recursive calls must eventually reach a base case.  Recursive calls: recursive conditions Calls to the current method. Each call must reduce the size of the problem and move it toward the base case; reduces the size of the problem..

10 Visualizing Recursion  Recursion trace  A box for each recursive call  An arrow from each caller to callee  An arrow from each callee to caller showing return value Example recursion trace: recursiveFactorial(4) (3) (2) (1) (0) return1 call return1*1=1 2*1=2 3*2=6 4*6=24 final answer call

11 Tips on Recursive Analysis  Identify exit and recursive conditions.  Ensure that the conditions cover all input ranges.

12 Input Range Analysis of Fac  Fac-1 and Fac-2: n (or number) has the type of int.  Fac-2 may be caught in circularity forever for negative numbers.

13 Reversing an Array Algorithm ReverseArray(A, i, j): Input: An array A and nonnegative integer indices i and j Output: The reversal of the elements in A starting at index i and ending at j if i < j then Swap A[i] and A[ j] ReverseArray(A, i + 1, j - 1) return

14 Tips on Constructing Recursion  In creating recursive methods, it is important to define the methods in ways that facilitate recursion.  This sometimes requires we may define additional parameters that are passed to the method.  For example, we defined the array reversal method as ReverseArray(A, i, j), not ReverseArray(A).

15 Computing Powers  The power function, p(x,n)=x n, can be defined recursively:  This leads to an power function that runs in linear time (for we make n recursive calls).  We can do better than this, however.

16 Recursive Squaring  We can derive a more efficient linearly recursive algorithm by using repeated squaring:  For example, 2 4 = 2 ( 4 / 2 ) 2 = ( 2 4 / 2 ) 2 = ( 2 2 ) 2 = 4 2 = 16 2 5 = 2 1 +( 4 / 2 ) 2 = 2 ( 2 4 / 2 ) 2 = 2 ( 2 2 ) 2 = 2 ( 4 2 ) = 32 2 6 = 2 ( 6 / 2)2 = ( 2 6 / 2 ) 2 = ( 2 3 ) 2 = 8 2 = 64  = 2 1 +( 6 / 2 ) 2 = 2 ( 2 6 / 2 ) 2 = 2 ( 2 3 ) 2 = 2 ( 8 2 ) = 128. Note: This definition leads to linear recursive algorithm that uses O(n)

17 A Recursive Squaring Method Algorithm Power(x, n): Input: A number x and integer n Output: The value x n if n = 0then return 1 if n is odd then y = Power(x, (n - 1)/ 2) return x · y · y else y = Power(x, n/ 2) return y · y

18 Analyzing the Recursive Squaring Method Algorithm Power(x, n): Input: A number x and integer n Output: The value x n if n = 0then return 1 if n is odd then y = Power(x, (n - 1)/ 2) return x · y · y else y = Power(x, n/ 2) return y · y It is important that we used a variable twice here rather than calling the method twice. Each time we make a recursive call we halve the value of n; hence, we make log n recursive calls. That is, this method runs in O(log n) time.

19 Further Analysis  Need to limit the range of n, or.  Add the recursive condition: if n < 0 return 1 / Power(x, -n);

20 Tail Recursion 1  Tail recursion occurs when a linearly recursive method makes its recursive call as its last step.  The array reversal method is an example.  Such methods can be easily converted to non-recursive methods (which saves on some resources), often by the compiler and runtime system.

21 Tail Recursion Example Algorithm IterativeReverseArray(A, i, j ): Input: An array A and nonnegative integer indices i and j Output: The reversal of the elements in A starting at index i and ending at j while i < j do Swap A[i ] and A[ j ] i = i + 1 j = j - 1 return

22 Tail Recursion 2  Tips: for linear recursion, write your method using tail recursion.  Example: Fac-1 does not use tail recursion. Fac-2 does.

23 Binary Recursion  Binary recursion occurs whenever there are two recursive calls for each non-base case.  Also known as Higher-Order Recursion.  Example: Fibonacci number 0, 1, 1, 2, 3, 5, 8, 13, 21, 34

24 Fibonacci Numbers  Fibonacci numbers are defined recursively: F 0 = 0 F 1 = 1 F i = F i - 1 + F i - 2 for i > 1.

25 Binary Recursion  Binary Recursions are expensive.  If possible, convert it to linear recursion.

26 Recursive Fibonacci Algorithm Algorithm BinaryFib( k ) : Input: Nonnegative integer k Output: The kth Fibonacci number F k if k = 1 then return k else return BinaryFib( k - 1 ) + BinaryFib( k - 2 )  Binary recursion from the text book.  Any problem here?

27 A C++ Implementation long fib(unsigned long n) { if (n <= 1) { return n; } else { return fib(n-1)+fib(n-2); }

28 Analyzing the Binary Recursion Fibonacci Algorithm  Let n k denote number of recursive calls made by BinaryFib(k). Then n 0 = 1 n 1 = 1 n 2 = n 1 + n 0 + 1 = 1 + 1 + 1 = 3 n 3 = n 2 + n 1 + 1 = 3 + 1 + 1 = 5 n 4 = n 3 + n 2 + 1 = 5 + 3 + 1 = 9 n 5 = n 4 + n 3 + 1 = 9 + 5 + 1 = 15 n 6 = n 5 + n 4 + 1 = 15 + 9 + 1 = 25 n 7 = n 6 + n 5 + 1 = 25 + 15 + 1 = 41 n 8 = n 7 + n 6 + 1 = 41 + 25 + 1 = 67.  Note that the value at least doubles for every other value of n k. That is, n k > 2 k/2. It is exponential!

29 Analyzing the Binary Recursion Fibonacci Algorithm //By Forouzan

30 A Better Fibonacci Algorithm  Use linear recursion instead: Algorithm LinearFibonacci(k): Input: A nonnegative integer k Output: Pair of Fibonacci numbers (F k, F k-1 ) if k = 1 then return (k, 0) else (i, j) = LinearFibonacci(k - 1) return (i +j, i)  Runs in O(k) time.

31 Questions and Comments?


Download ppt "Introduction to Recursion CSCI 3333 Data Structures."

Similar presentations


Ads by Google