1. 暴力迭代法
// 暴力迭代解法计算 pow(x, n)
public static long power(int x, int n) {
// 初始化结果为1
long pow = 1L;
// 循环n次,每次乘以x
for (int i = 0; i < n; i++) {
pow = pow * x;
}
return pow;
}
O(n)
2. 递归法
public static int power(int x, int n) {
// 如果 n 为0,则任何数的0次幂都为1
if (n == 0)
return 1;
// 如果 x 为0,则0的任何次幂都为0
if (x == 0)
return 0;
// 其他情况,递归调用
return x * power(x, n - 1);
}
O(n),但对于大的 n
值可能会导致栈溢出。
3. 优化递归法(分治法)
// 计算 x 的 y 次幂
static int power(int x, int y) {
if (y == 0)
return 1;
else if (y % 2 == 0)
return power(x, y / 2) * power(x, y / 2);
else
return x * power(x, y / 2) * power(x, y / 2);
}
如果 y
是偶数,分解为两个较小的相同子问题;如果 y
是奇数,则多乘以一个 x
。
O(log y)
但如果不优化,两个相同的递归调用可能导致不必要的计算重复。