【剑指offer】数值的整数次方(递归+数学)

题目描述

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0


暴力法:

思路很简单,直接for循环乘以exponent次,注意当exponent为负数时先把他变成整数,最后将结果求倒即可。

public class Solution {
    public double Power(double base, int exponent) {
        if (base == 0)
            return 0;
        if (exponent == 0)
            return 1;
        if (exponent == 1)
            return base;
        double res = base;
        int pos_exponent = Math.abs(exponent);
        for (int i = 1; i < pos_exponent; i++)
            res *= base;
        if (exponent < 0)
            res = 1.0 / res;
        return res;
    }
}

运行时间:27ms,占用内存:10484k

递归法

使用递归法需要计算exponent次,实际上可以利用指数乘法进行优化,例如计算 b e b^e be,假设e为偶数,则只需要知道 b e / 2 b^{e/2} be/2然后相乘即可,同理,计算 b e / 2 b^{e/2} be/2也只需要知道 b e / 4 b^{e/4} be/4即可,两者时间差不多

public class Solution {
    public double Power(double base, int exponent) {
        if (base == 0)
            return 0;
        if (exponent == 0)
            return 1;
        if (exponent == 1)
            return base;
        if (exponent == -1)
            return 1.0 / base;
        double half = Power(base, exponent / 2);
        return half * half * Power(base, exponent % 2);
    }
}

运行时间:26ms,占用内存:10504k

你可能感兴趣的:(剑指offer)