Math for Algorithms & Systems Analysis

(Note: we focus on counting problems here.) To define a recurrence, you have to figure out how to illustrate a problem T(n) in terms of the same problem(s) for smaller inputs, e.g. T(n - 1), T(n - 2). There are a few ways to go about this.

**1. Define T(n) = ... directly.**

- Think about the "inductive case": what does the T(n) setting add to whatever you had before? Or: how do you get to T(n)? I often try to motivate my thinking by "building up" from the T(n - 1) scenario to the T(n) scenario, even if there's ultimately something else to do.
- Sometimes, there'll be multiple options (
*different blocks*) or cases (*"use" or "don't use" n*), which'll require multiple recursive calls. - If T(n) introduces elements to count which are independent of the ones that already exist (
*handshakes*), add those elements directly. - If T(n) introduces C elements for each of some set of elements that already exist (
*colored tiles*), add C * the relevant recursive call. **Just count all the elements that should be included in T(n)**, e.g.*all valid length-n strings*. Define a single term for each group of elements, making sure not to double-count, until you've exactly covered all the elements. Then sum up the terms. And you're done!

**2. Work up from base cases.**

- If you need somewhere to start, define base cases (presumably, you have to do this anyway). Write out the first X and try to figure out how the latest base case can be derived from the one(s) before it.