繁体   English   中英

C实现电源功能

[英]C implementation of power function

我是一个初学者,试图理解这个无辜的C函数:给定两个数字x和y,这个函数计算x提升到y的幂。

/* Function to calculate x raised to the power y */
int power(int x, unsigned int y)
{
    if( y == 0)
        return 1;
    else if (y%2 == 0)
        return power(x, y/2)*power(x, y/2); //what's happening here?
    else
        return x*power(x, y/2)*power(x, y/2);
}

我正在努力追踪它们将两个函数的返回值相乘的部分。 假设我将4和3作为x和y传递,我的函数跳转到第二个其他部分。 并且我返回4*(power(4,1)*power(4,1))就我的理解而言,下一个呼叫是4*power(4,0)*power(4*0)并且因为y == 0返回1,它应该是4 * 1 * 1,我想要4 * 4 * 4。 我在这里遗漏了一些东西。 这个算法到底在做什么?

这个函数背后的逻辑是乘以x,y倍。 任何人都可以告诉我这个简单的除法运算(或分而治之)如何实现逻辑? 提前致谢。

使用的算法是通过平方取幂 它分为两部分,正整数n

在此输入图像描述

因此,上述函数,对于偶数指数将返回

power(x, y/2)*power(x, y/2);  

对于奇数指数将返回

x*power(x, y/2)*power(x, y/2);   

它将按log(n)时间计算功率。

对于2 5 ,它将被执行为:

  • 5是奇数因此return 2*power(2, 5/2)*power(2, 5/2) 5 return 2*power(2, 5/2)*power(2, 5/2) 5 return 2*power(2, 5/2)*power(2, 5/2)将被执行。
  • 5/2 = 2 ,将执行均匀的return power(2, 2/2)*power(2, 2/2)
  • 2/2 = 1是奇数因此return 2*power(2, 1/2)*power(2, 1/2)将被执行。
  • 1/2 = 0 ,因此对于两个power(2, 1/2)基本条件,将返回1

所以,

  • return 2*power(2, 1/2)*power(2, 1/2)将向其呼叫者返回2*1*1 = 2
  • return power(2, 2/2)*power(2, 2/2)将向其呼叫者返回2*2 = 4
  • return 2*power(2, 5/2)*power(2, 5/2)将返回2*4*4 = 32给它的来电。

一个更有效的版本

int power(int x, unsigned int y)
{
    if( y == 0)
        return 1;

    int t = power(x, y/2);  // power is called only once instead of twice.

    return y%2 ? x*t*t : t*t;
}

为简单起见,以下功能以更容易理解的方式演示了递归:


int power(int x, unsigned int y)
{
    if( y == 0)
        return 1;

    return x * power(x, y-1);
}

这显示了使用递归来处理幂计算的简单方法。 你拥有的方法仍然会大致做到这一点,但它的最大堆栈深度会更好(它会减少更多),因为它可以更好地划分工作。

不知道你为什么要在现实世界中使用它们。 迭代可能会更加优越,或者可能是对数 - 乘法指数 - 反对数方法(也可以处理法定指数)。

另外,这种类型的计算也很容易出现溢出整数值,非常快,所以请注意。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM