How recurrence solving actually works in practice
The Master Theorem handles most divide-and-conquer recurrences you will encounter, and the Akra-Bazzi theorem handles the rest. People conflate these into a single concept called Theorem In Analysis Of Algorithm, but there is no such unified theorem. What actually exists is a small set of tools for solving recurrences without expanding the recurrence by hand. Knowing which tool applies to which recurrence structure matters far more than memorizing formulas. The standard recurrence form the Master Theorem addresses is T(n) = aT(n/b) + f(n), where a >= 1 and b > 1 are constants. You compute log_b(a), compare it against the exponent of f(n), and pick a case. If f(n) grows faster, the answer is dominated by the root work. If the recurrence does equal the root work, you get an extra log factor. If f(n) is smaller, the answer is the leaf count, (n^{log_b(a)}). For example, T(n) = 2T(n/2) + n^2 gives log_2(2) = 1. Since 2 > 1, Case 3 applies, and T(n) = (n^2). You can verify this by expanding the recurrence tree and summing across levels. The top level does n^2 work, the next two levels each do n^2/2 total work, and so on. The geometric series converges to a constant multiple of n^2.
The trap people fall into repeatedly is forcing the Master Theorem onto recurrences it does not cover. T(n) = T(n-1) + n is not a divide-and-conquer recurrence. The subproblem size shrinks by a constant amount, not by a constant factor. The Master Theorem cannot handle this, and trying to make it work will produce wrong answers every time. The correct approach here is either telescoping or characteristic equation methods, which give (n^2) anyway but through a completely different mechanism. Recurrences with non-uniform splits require the Akra-Bazzi theorem. T(n) = T(n/3) + T(2n/3) + n is a classic example where the two subproblems have different sizes. The Master Theorem fails here, but Akra-Bazzi works cleanly. You find p such that (1/3)^p + (2/3)^p = 1, which gives p = 1. Then you integrate and get T(n) = (n log n). The same O(n log n) result appears in randomized quicksort analysis, though the derivation there uses a different probabilistic argument. Akra-Bazzi is a direct computational tool, not a probabilistic bound. Another place beginners waste time is recurrences with polynomially varying non-homogeneous terms, like T(n) = 4T(n/2) + n^2 / log n. The Master Theorem requires f(n) to be polynomially larger or smaller, but n^2 / log n is within a logarithmic factor of n^2, so the regularity conditions fail. Akra-Bazzi handles this without modification. The integral approach produces T(n) = (n^2 log log n), which is a result you cannot derive from the Master Theorem alone.
I ran into a concrete issue once while analyzing a subproblem decomposition in a string matching algorithm. The recurrence came out as T(n) = T(n/2) + T(n/4) + n. Standard Master Theorem templates did not apply because the split was asymmetric across two different branches. Akra-Bazzi gave the right answer quickly, but the p-value equation (1/2)^p + (1/4)^p = 1 required numerical solving. I found p 0.694 by iteration, and the final bound was (n). A colleague initially guessed (n log n) by pattern-matching against quicksort, which was wrong because the recursion depth is not (log n) here. The total work across levels decreases geometrically, making the root level dominant.
Get the Full Details

When these tools break down completely
The substitution method, also called proof by induction, is not a shortcut. It is the fallback when no closed-form theorem applies, and it requires you to already know or guess the correct bound before you prove it. This makes it nearly useless during initial algorithm design when the asymptotic behavior is unknown. Experienced practitioners use it mainly to verify bounds after deriving them through tree expansion or the Akra-Bazzi integral. Recurrences with floor and ceiling functions, like T(n) = 2T(n/2) + n, technically fall outside the Master Theorem's pure mathematical form. In practice the floor and ceiling do not change the asymptotic result, but a rigorous proof requires the Smoothness Rule or an induction argument. Many introductory courses skip this step, which creates confusion later when students encounter divide-by-two recurrences in production code where array boundaries matter. The Master Theorem also breaks for recurrences where the subproblem count a depends on n, not a constant. T(n) = nT(n/2) + 1 has a varying coefficient and cannot be analyzed with any of the standard tools. You would need to use iteration or a completely different approach, and in most cases the recurrence describes an algorithm that is impractical anyway, since the branching factor grows with input size.
Practical resources and verification
For learning and reference, CLRS Chapter 4 and Kleinberg-Tardos Chapter 4 cover recurrence solving methods with appropriate rigor. The algorithms course notes from MIT OpenCourseWare (6.046) contain worked examples that are closer to real exam problems than most textbook summaries. For verification of specific recurrences, Wolfram Alpha can solve many standard forms, though it does not explain the reasoning, so you still need to understand which theorem applies to avoid feeding it a recurrence it cannot handle correctly. The most reliable workflow is to first identify the recurrence structure by inspection, then apply the simplest applicable theorem, and finally verify the result with a small case expansion or a substitution proof. Skipping the verification step is where most incorrect bounds originate in practice, not the theorem application itself.