/** * A pair of measured exponentiation functions. * * @author Samuel A. Rebelsky * @version 1.0 of September 1998 */ public class MeasuredExponentiation { // +--------+--------------------------------------------------- // | Fields | // +--------+ /** The number of steps used during computation. */ protected int steps; // +---------+-------------------------------------------------- // | Methods | // +---------+ /** * Reset the count of steps to 0. */ public void resetCounter() { steps = 0; } // resetCounter() /** * Determine the number of steps used since the last call to * resetCounter(). */ public int getSteps() { return steps; } // getSteps() /** * Iteratively compute x^n, for n >= 0. */ public double itExp(double x, double n) { double result = 1.0; int i; // A counter for (i = 1; i <= n; ++i) { ++steps; result = result * x; } // for return result; } // itExp(double,int) /** * Recursively compute x^n, for n >= 0. */ public double recExp(double x, double n) { ++steps; // Base case: n is 0, x^n is 1. if (n == 0) { return 1.0; } // base case // Recursive case: n is 2k. Compute x^k. else if (n%2 == 0) { double tmp = recExp(x, n/2); return tmp*tmp; } // n is even // Recursive case: n is odd. Compute x*x^(n-1). else { return x * recExp(x, n-1); } //n is odd } // recExp(double,int) } // class MeasuredExponentiation