递归取幂

时间:2013-12-08 22:46:33

标签: c algorithm recursion

所以我必须编写一个递归算法来求幂,我必须使用它来使算法更快:http://i.imgur.com/Ig87RZ2.png然后我必须弄清楚多少时间正在发生。我写了它,但我不确定我是否正确 - 我也需要一些帮助来找出乘法部分。

#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;
}

3 个答案:

答案 0 :(得分:4)

归纳定义是

  1. 如果k是偶数,则x ^ k = [x ^(k / 2)] ^ 2
  2. 如果k为奇数,那么x ^ k = x * [x ^(floor(k)/ 2)] ^ 2
  3. 通过这些,可以更容易地看到如何安排递归:

    #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);
}