(C ++)实现指数函数求值器而不递归?

时间:2014-10-21 02:17:57

标签: c++ function recursion

我正在创建一个指数函数求值程序(即一个函数EXPO(int q,int p),它评估不使用递归的q ^ p),我有点坚持如何这样做。你会把q乘以q次,还是我错过了什么?

4 个答案:

答案 0 :(得分:2)

假设指数是非负的:

long long int exp(int b, int e)
{   long long int r = 1;
    long long int b_ = 1ll * b;
    while(e > 0)
    {   if(e & 1) r *= b_;
        b_ *= b_;
        e >>= 1;
    }
    return r;
}

这需要对数时间,因为我们遍历指数的位。

答案 1 :(得分:1)

除非p为否定,否则就是全部。

答案 2 :(得分:1)

明确地不会使用“你会把q乘以q倍” - 这是不必要的低效率。
另一方面,即使使用unsigned long long,许多值也会快速溢出。

以下在O(log2(b))时间内运行。

与@saadtaame没什么不同,但更喜欢处理unsigned数学。

// return `a` raised to the `b` power.
unsigned long long ipower(unsigned a, unsigned b) {
  unsigned long long y = 1;
  unsigned long long power = a;
  while (b) {
    if (b % 2) y *= power;
    b /= 2;
    power *= power;
  }
  return y;
}

注意,这会返回ipower(0,0) --> 1,这是0,0特殊情况的常见预期结果。数学上可以对01或其他结果(包括错误)的结果进行论证。 1适合许多需求。

答案 3 :(得分:0)

对于无符号指数,你所拥有的(大多数)是正确的,你只需要处理自n0 = 1以来零的边缘情况。伪代码如下:

def power(base,power):
    result = 1
    while power > 0:
        result = result * base
        power = power - 1
    return result

对于负面力量(如果你是如此倾向),你只需要意识到n-x = 1 / nx

def power(base,power):
    pneg = false
    if power < 0:
        power = -power
        pneg = true

    result = 1
    while power > 0:
        result = result * base
        power = power - 1

    if pneg:
        result = 1 / result

    return result