pow1(x^2, n/2) * x
更改为return x*pow1(x^2, n/2)
会怎样?
int pow1(int x, int n){
if(n==0)
return 1; else
if(n==1)
return x; else
if("n is odd")
return pow1(x^2, n/2) * x ; else // change to return x*pow1(x^2, n/2) ?
if("n is even")
return pow1(x^2, n/2);
}
int pow2(int x, int n){
p=1;
for(int i=1;i<=n;i++){
p = p*x;
}
return p;
}
答案 0 :(得分:2)
第二种算法执行n次乘法。第一个对n中的每个位执行一次乘法运算;这使得它在n中成对数。该方法称为exponentiation by squaring。
如果我在第一个函数中更改pow1(x ^ 2,n / 2)* x以返回x * pow1(x ^ 2,n / 2)会发生什么? 没有什么变化,因为乘法是可交换的。
在侧节点上,这是用某种编程语言编写的,还是伪编码?在许多语言中,x ^ 2表示x和2之间的按位XOR,而不是x平方。要平方x,只需执行x * x。
答案 1 :(得分:1)
首先是O(logn)
,第二个是O(n)
。因此,对于足够大的n
,第一个更快。