我们知道在数学表达式中pow(x, n)表示求x^n的幂。一般情况下,如果我们要写一个程序的话,最简单的程序可能是这样的:
int pow(int x, int n){
int result = 1;
while (n != 0){
result = result *x;
n = n -1;
}
return result;
}
通过使用如上的程序,2^4 = 2 * 2 * 2 * 2,在程序中做了4-1=3次乘法,但是有没有更高效的算法来减少乘法的次数呢。
答案是肯定的。
我们知道
2^9 = 2^4 * 2^4 * 2
2^8 = 2^4 * 2^4
2^7 = 2^3 * 2^3 * 2
2^6 = 2^3 * 2^3
……
我们发现了什么?
x^n = x^(n/2) * x^(n/2) (n为偶数)
x^n = x^(n/2) * x^(n/2) * n (n为奇数);
这样的话我们就可以使用递归的方法将问题化为一半一半的解法。(divide and conquer)
程序如下:
int pow2(int x, int n){
if (n == 1) return x;
if (n == 0) return 1;
else if (n & 1)
return pow2(x, n/2) * pow2(x, n/2) * x;
else
return pow2(x, n/2) * pow2(x,