# Introduction to Recursion - PowerPoint PPT Presentation

PPT – Introduction to Recursion PowerPoint presentation | free to download - id: 74d9da-MWZmN

The Adobe Flash plugin is needed to view this content

Get the plugin now

View by Category
Title:

## Introduction to Recursion

Description:

### CSCI 3333 Data Structures Introduction to Recursion by Dr. Bun Yue Professor of Computer Science yue_at_uhcl.edu http://sce.uhcl.edu/yue/ 2013 – PowerPoint PPT presentation

Number of Views:86
Avg rating:3.0/5.0
Slides: 38
Provided by: YUE84
Category:
Tags:
Transcript and Presenter's Notes

Title: Introduction to Recursion

1
Introduction to Recursion
CSCI 3333 Data Structures
by Dr. Bun Yue Professor of Computer
Science yue_at_uhcl.edu http//sce.uhcl.edu/yue/ 201
3
2
Acknowledgement
• Mr. Charles Moen
• Dr. Wei Ding
• Ms. Krishani Abeysekera
• Dr. Michael Goodrich

3
Recursion
• 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 x1 is a natural
number. (or x is a natural number if x-1 is a
natural number).

5
Mathematical Induction
• Proof by Induction is recursive in nature.
• To prove S(n) for all n 1, 2, 3.
• Show
• S(n) is true for n 1.
• If S(k) is true for all k from 1 to n-1, then
S(n) is true

6
Recursive Methods
• A recursive method may call itself.
• Example factorial.
• Iterative definition
• n! n . (n-1) . (n-2) 3 . 2 . 1
• Recursive definition

7
Factorial Implementation Fac-1
• Found here in C
• int factorial(int number)
• int temp
• if (number lt 1) return 1
• temp number factorial(number - 1)
• return temp
• What do you think?

8
Another Implementation Fac-2
• // recursive factorial function in Java
• public static int recursiveFactorial(int n)
• if (n 0) return 1 // base case
• else return n
• recursiveFactorial(n- 1)
• // recursive case
• // By Goodrich
• What do you think?

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 recursive call should be defined so that it
makes progress towards a base case.

10
Visualizing Recursion
Example recursion trace
• 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

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.
• This is especially serious in Java as it does not
support unsigned int.

13
Complexity Analysis
• To analyze the time complexity of a recursive
routine, a recurrence relation may need to be
identified and solved.
• E.g. for factorial
• T(0) d
• T(N) T(N-1) c
• Solving by substitution T(N) cN d O(N)

14
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 lt j then
• Swap Ai and A j
• ReverseArray(A, i 1, j - 1)
• end if
• return

15
Tips on Constructing Recursion
• In creating recursive methods, it is important to
define the methods in ways that facilitate
recursion.
• This sometimes requires that 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).

16
Implementation in Java
• public static void arrayReversal (int a)
• arrayReversalWithRange(a, 0, a.length-1)
• private static void arrayReversalWithRange
• (int a, int i, int j)
• if (i lt j)
• int temp ai
• ai aj
• aj temp
• arrayReversalWithRange(a,i1,j-1)

17
Calling arrayReversal
• public static void main (String args)
• int b 1,2,3,4,5,6,7
• arrayReversal(b)
• for (int i0 iltb.length i)
• System.out.println(bi " ")

18
Computing Powers
• The power function, p(x,n)xn, 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.

19
Recursive Squaring
• We can derive a more efficient linearly recursive
algorithm by using repeated squaring
• For example,
• 24 2(4/2)2 (24/2)2 (22)2 42 16
• 25 21(4/2)2 2(24/2)2 2(22)2 2(42) 32
• 26 2(6/ 2)2 (26/2)2 (23)2 82 64
• 27 21(6/2)2 2(26/2)2 2(23)2 2(82) 128.

20
A Recursive Squaring Method
• Algorithm Power(x, n)
• Input A number x and integer n
• Output The value xn
• if n 0 then
• 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

21
Analyzing the Recursive Squaring Method
• Algorithm Power(x, n)
• Input A number x and integer n
• Output The value xn
• if n 0 then
• 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

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.
It is important that we used a variable twice
here rather than calling the method twice.
22
Further Analysis
• Need to limit the range of n, or.
• if n lt 0 return 1 / Power(x, -n)

23
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 easily be converted to
non-recursive methods (which saves on some
resources), often by the compiler and runtime
system.

24
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 lt j do
• Swap Ai and A j
• i i 1
• j j - 1
• return

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

26
Binary Recursion
• Binary recursion occurs whenever there are two
recursive calls for each non-base case.
• Example the DrawTicks method for drawing ticks
on an English ruler.

27
A Binary Recursive Method for Drawing Ticks
• // draw a tick with no label
• public static void drawOneTick(int tickLength)
drawOneTick(tickLength, - 1)
• // draw one tick
• public static void drawOneTick(int tickLength,
int tickLabel)
• for (int i 0 i lt tickLength i)
• System.out.print("-")
• if (tickLabel gt 0) System.out.print(" "
tickLabel)
• System.out.print("\n")
• public static void drawTicks(int tickLength)
// draw ticks of given length
• if (tickLength gt 0) // stop when
length drops to 0
• drawTicks(tickLength- 1) // recursively
draw left ticks
• drawOneTick(tickLength) // draw center
tick
• drawTicks(tickLength- 1) // recursively
draw right ticks
• public static void drawRuler(int nInches, int
majorLength) // draw ruler
• drawOneTick(majorLength, 0) // draw tick 0
and its label
• for (int i 1 i lt nInches i)

Note the two recursive calls
28
Binary Recursion
• Binary Recursions are expensive.
• If possible, convert it to linear recursion.

29
Fibonacci Numbers
• Fibonacci numbers are defined recursively
• F0 0
• F1 1
• Fi Fi-1 Fi-2 for i gt 1.

30
Recursive Fibonacci Algorithm
• Algorithm BinaryFib(k)
• Input Nonnegative integer k
• Output The kth Fibonacci number Fk
• if k 1 then
• return k
• else
• return BinaryFib(k - 1) BinaryFib(k - 2)
• Binary recursion from Goodrichs book.
• Any problem here?

31
A C Implementation
• long fib(unsigned long n)
• if (n lt 1)
• return n
• else
• return fib(n-1)fib(n-2)

32
Fibonacci Number
• Negative Fibonacci Number
• F-1  1,
• F-2  -1,
• Fn  F(n2)-F(n1).
• 1,-1,2,-3,5,-8,13,

33
Analyzing the Binary Recursion Fibonacci Algorithm
• Let nk denote number of recursive calls made by
BinaryFib(k). Then
• n0 1
• n1 1
• n2 n1 n0 1 1 1 1 3
• n3 n2 n1 1 3 1 1 5
• n4 n3 n2 1 5 3 1 9
• n5 n4 n3 1 9 5 1 15
• n6 n5 n4 1 15 9 1 25
• n7 n6 n5 1 25 15 1 41
• n8 n7 n6 1 41 25 1 67.
• Note that the value at least doubles for every
other value of nk. That is, nk gt 2k/2. It is
exponential!

34
A Better Fibonacci Algorithm
• Algorithm LinearFibonacci(k)
• Input A nonnegative integer k
• Output Pair of Fibonacci numbers (Fk,
Fk-1)
• if k 1 then
• return (k, 0)
• else
• (i, j) LinearFibonacci(k - 1)
• return (i j, i)
• Runs in O(k) time.

35
Implementation
• Java and C do not return multiple values.
• Perls implementation
• sub fib
• return (1,0) if _0 1
• my (i, j) fib(_0-1)
• return (ij, i)
• print "fib(13) " fib(13) "\n"

36
Java implementation
• public static int Fab(int n)
• if (n lt 2) return 1
• return FabHelper(n,2,1,1)
• private static int FabHelper(int n, int k, int
fk, int fk_1)
• if (n k) return fk
• else
• return FabHelper(n, k1, fk fk_1, fk)

37