##题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
##解题思路
主要涉及完整性考虑,首先按照正数次幂,负数次幂,0次幂,三种分析,底数为0和非0。
1,第一种方式,常规做法
2,第二种方式,用递归的方法,效率提高
3,第三种方式,用快速幂的方法,可以实现递归的效果
##代码实现

/**
 * 
 */
package 发散思维;

/**
 * <p>
 * Title:Power
 * </p>
 * <p>
 * Description:
 * </p>
 * 
 * @author 田茂林
 * @data 2017年8月25日 上午9:49:35
 */
public class Power {

	/**
	 * void
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println(DouPowerSuperMax(-2.0, -3));

	}

	// ==================================================================常规方法
	public static double DouPower(double base, int exponent) {
		if (base == 0) {
			return 0;
		}
		if (exponent > 0) { // 正数次幂
			double result = 1;
			for (int i = 1; i <= exponent; i++) {
				result *= base;
			}
			System.out.println(result);
			return result;

		} else if (exponent < 0) {
			double result = 1;
			for (int i = 1; i <= -exponent; i++) { // 负数次幂
				result *= base;
			}
			return 1 / result;

		} else { // 任何数的0次幂都是1
			return 1;
		}
	}

	// ==================================================================递归方式
	
	public static double DouPowerSuper(double base, int exponent) {
		if (exponent > 0) {
			return helper(base, exponent);
		} else {
			return 1.0 / helper(base, exponent);
		}
	}

	public static double helper(double base, int exponent) {
		if (exponent < 0) {
			exponent = -exponent;
		}
		if (exponent == 0) {
			return 1;
		}
		if (exponent == 1) {
			return base;
		}
		double result = helper(base, exponent >> 1); // 递归方式可以让指数成倍的增长,减少运算次数
		result *= result;

		if ((exponent & 1) == 1) {
			result *= base; // 如果是奇数,要多乘一次
		}

		return result;

	}

	// ==================================================================快速幂方式
/**
 * 1.全面考察指数的正负、底数是否为零等情况。
 * 2.写出指数的二进制表达,例如13表达为二进制1101。
 * 3.举例:10^1101 = 10^0001*10^0100*10^1000。
 * 4.通过&1和>>1来逐位读取1101,为1时将该位代表的乘数累乘到最终结果。
 */
	public static double DouPowerSuperMax(double base, int exponent) {
		int flag = exponent;
		if (base == 0)
			return 0;
		if (exponent == 0) {
			return 1;
		}
		if (exponent < 0) {
			exponent = -exponent;
		}
		int res = 1;
		while (exponent != 0) {
			if ((exponent & 1) != 0) {
				res *= base;
			}
			base *= base;
			exponent = exponent >> 1;
		}
		return flag > 0 ? res : 1.0 / res;

	}

}