| Powers |
Our earlier examples of programs using recursion involved recursive structures - classes that included instance variables with the same interface as the class itself. Another form of recursion is based on integers. The idea is the same as before - more complicated cases are solved by invoking the method on simpler cases.
Let's look at a recursive program to raise numbers to powers:
/**
* @param exponent >= 0
* @returns base raised to exponent
power
**/
public int power(int base, int exponent) {
if (exponent == 0) {
return 1;
} else {
return base * power(base,exponent-1);
}
}
The key is that we are using the facts that b0 = 1 and be+1 = b*be to calculate powers. Because we are calculating complex powers using simpler powers we eventually get to our base case.
Using a simple modification of the above recursive program we can get a very efficient algorithm for calculating powers. In particular, if we use either of the above programs it will take 1024 multiplications to calculate 31024. Using a slightly cleverer algorithm we can cut this down to only 11 multiplications!
/*
* @param exponent >= 0
* @returns base raised to exponent power
*/
public int fastPower(int base, int exponent) {
if (exponent == 0)
return 1;
else if (exponent%2 == 1) // exponent is odd
return base * fastPower(base, exponent-1);
else // exponent is even
return fastPower(base * base, exponent / 2);
}
The full source code appears in the following:
Demo: Powers
See the text for details as to why this program is so efficient.
We can both write and understand recursive programs as follows:
| Powers |