算法通关村第十三关——pow(x, n)

35 阅读1分钟

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)
但如果不优化,两个相同的递归调用可能导致不必要的计算重复。