Up: Recursion. Prev: Faster exponentiation.
Here's my solution using our new observation.
function exponentiate(n) { if(n == 0) { // base case return 1; } else if(n % 2 == 0) { // then n is even return exponentiate(x * x, n / 2); } else { // then n is odd return x * exponentiate(x * x, (n - 1) / 2); } }
At the end of the last page, we asked how deep the recursion will go. Here's a way to bound it: Let's look at the call tree for exponentiate(2, 12).
If we go log2 n levels deep, the exponent at that level is at most n * (1/2)log2 n = 1. When we go one more level deep, the exponent will become 0 and we will have reached the base case. So the deepest the recursion will ever go is 1 + log2 n levels.
This is much better than the n levels we saw with our first algorithm. This new function is a lot faster.