所以我必须编写一个递归算法来求幂,我必须使用它来使算法更快:然后我必须弄清楚多少时间正在发生。我写了它,但我不确定我是否正确 - 我也需要一些帮助来找出乘法部分。
#include <stdio.h>
#include <math.h>
double intpower(double x, int n)
{
double result;
if(n>1&&n%2!=0) {result=x*intpower(x,(n-1)/2)*intpower(x,(n-1)/2);}
if(n>1&&n%2==0) {result=intpower(x,n/2)*intpower(x,n/2);}
if(n==1) return x;
else return result;
}
int main()
{
int n;
double x,result;
printf("x\n");
scanf("%lf", &x);
printf("n\n");
scanf("%d", &n);
printf("result = %.2f\n", intpower(x,n));
return 0;
}
答案 0 :(得分:4)
归纳定义是
通过这些,可以更容易地看到如何安排递归:
#include <stdio.h>
double int_pwr(double x, unsigned k)
{
if (k == 0) return 1;
if (k == 1) return x; // This line can be omitted.
double y = int_pwr(x, k/2);
return (k & 1) ? x * y * y : y * y;
}
int main(void)
{
double x;
unsigned k;
scanf("%lf%u", &x, &k);
printf("x^k=%lg\n", int_pwr(x, k));
return 0;
}
通过在每个级别进行两次递归调用,我已经将类型更改为逻辑更多并保存了OP的解决方案所做的指数(k)工作量。
关于乘法的数量,很容易看出如果k
的最高阶位是2 ^ p(即位置p),那么你将需要p乘法来重复的方形。另一种说法是p = floor(log_2(k))。例如,如果k = 4 = 2 ^ 2,则你将方形平方得到答案:2次乘法。此外,您还需要q-1,其中q是k
的二进制代表中的1的数量。这是“奇数”检查的真实次数。即如果k = 5(其中2位为1),则将方形平方,然后再将结果乘以x
。总之,乘法的数量是p + q - 1,p和q如上所定义。
答案 1 :(得分:0)
要计算出乘法发生的次数,您可以在intpower()
计算它们。
static int count = 0;
double intpower(double x, int n) {
double result;
if(n>1&&n%2!=0) {result=x*intpower(x,(n-1)/2)*intpower(x,(n-1)/2); count += 2;}
if(n>1&&n%2==0) {result=intpower(x,n/2)*intpower(x,n/2); count++;}
if(n==1) return x;
else return result;
}
int main() {
int n;
double x,result;
printf("x\n");
scanf("%lf", &x);
printf("n\n");
scanf("%d", &n);
mcount = 0;
printf("result = %.2f\n", intpower(x,n));
printf("multiplcations = %d\n", mcount);
return 0;
}
答案 2 :(得分:0)
试试这个
double intpower(double x, int n)
{
if(n == 0) return 1;
if(n == 1) return x;
if(n%2!=0)
{
return x*intpower(x,(n-1));
}
else
{
x = intpower(x,n/2);
return x*x;
}
}
或者您可以将功能缩减到一行
double intpower(double x, int n)
{
return n == 0 ? 1 : n%2 != 0 ? x*intpower( x, (n-1) ) : (x = intpower(x, n/2), x*x);
}