Professional Documents
Culture Documents
Analyzing Recursion
David Kaplan
Dept of Computer Science & Engineering
Autumn 2001
Recursion Rules
Rules for using recursion effectively (Weiss 1.3):
1. Base cases Must have some non-recursive base case(s).
2. Making progress Recursive call must progress toward a
base case.
3. Design rule Assume the recursive calls work.
4. Compund interest rule Dont duplicate work in separate
recursive calls.
Analyzing Recursion
Recurrence Equations
A recursive procedure can often be analyzed by
solving a recurrence equation of the form:
T(n) =
base case: some constant
recursive case: T(subproblems) + T(combine)
Analyzing Recursion
One subproblem
Linear reduction in size (decrease by 1)
Combining: constant (cost of 1 add)
T(0) b
T(n) c + T(n 1)
Analyzing Recursion
for n>0
for n>0
Solution:
T(n) c + c + T(n-2)
c + c + c + T(n-3)
kc + T(n-k) for all k
nc + T(0) for k=n
cn + b = O(n)
Analyzing Recursion
Equation:
T(1) b
T(n) T(n/2) + c for n>1
Analyzing Recursion
for n>1
Solution:
T(n) T(n/2) + c
T(n/4) + c + c
T(n/8) + c + c + c
T(n/2k) + kc
T(1) + c log n where k = log n
b + c log n = O(log n)
Analyzing Recursion
Binary Search
Problem size
n
n/2
n/4
O(1)
log n
O(1)
(log n)
Analyzing Recursion
Example: MergeSort
Split array in half, sort each half, merge sub-arrays
2 subproblems, each half as large
linear amount of work to combine
T(n) 2T(n/2)+cn
2(2(T(n/4)+cn/2)+cn
4(2(T(n/8)+c(n/4))+cn+cn
= 8T(n/8)+cn+cn+cn 2kT(n/2k)+kcn
2kT(1) + cn log n
where k = log n
= O(n log n)
Analyzing Recursion
Merge Sort
Problem size
n
n/2
n/4
O(n)
n/2
n/4
O(n)
n/4
O(n)
log n
O(n)
(n log n)
Analyzing Recursion
10
Analyzing Recursion
11
Fib(3)
Fib(3)
Fib(2)
Fib(1)
Fib(2)
Fib(0)
Fib(0)
Fib(1)
Fib(1)
Fib(1)
Fib(0)
Analyzing Recursion
Fib(2)
Fib(1)
12
if n > 1
In fact:
Fib(n) = ((3/2)n), Fib(n) = O((5/3)n), Fib(n) = (n)
where = (1 + 5)/2
Analyzing Recursion
13
Non-Recursive Fibonacci
Avoid recursive calls
Keep a table of calculated values
each time you calculate an answer, store it in the table
Memoization
a form of dynamic programming
Analyzing Recursion
14