递归地计算base到n次幂的值

时间:2011-05-05 00:01:29

标签: java recursion

以下是我的解决方案:

 public int powerN(int base, int n) {

    if(n == 0)
       return 1;

    else if(n % 2 == 0)
       return base * base;

    else
       return base * powerN(base, n-1); 

 }

但是,如果n> 3然后此功能不起作用。 例如,powerN(2,4)产生4,而powerN(2,5)产生8。 我知道存在一个更简单的解决方案,但我无法弄清楚为什么这不能正常工作。

10 个答案:

答案 0 :(得分:5)

else if(n % 2 == 0)
   return base * base;

这个位不正确 - 它返回任何偶数幂的平方,而不仅仅是2.看起来你正在尝试实现square and multiply优化。因此,如果你想计算powerN(base, n),你可以利用n是偶数的事实进行递归调用吗?您会为basen传递哪些新值?使用 b 2 n =( b 2 的标识名词

答案 1 :(得分:4)

进入伪代码

让我将您的代码翻译成伪代码:

public int powerN(int base, int exponent)  {
    if the exponent is 0
        then return 1
    otherwise, if the exponent is even
        then return base * base
    otherwise
        base * powerN(base, exponent - 1)
}

第二个分支有逻辑错误。你的代码所说的是:“只要指数是偶数,结果就应该是base * base(即base平方)”。您已经提到过这是您运行代码时得到的结果。

如何解决

您可能要做的是将base提升到exponent的一半(base * base * base * ... exponent / 2次),然后将该数字相乘。这样,您就会base乘以exponent次。

在伪代码中:

otherwise, if the exponent is even
    then return powerN(base, exponent / 2) * powerN(base, exponent / 2)

实际上,这实际上是以下内容:

otherwise, if the exponent is even
    then {
        let x = powerN(base, exponent / 2)
        return x * x
    }

完成。居多。

将其翻译回Java,您将被设置。

答案 2 :(得分:2)

Buggy代码是:

else if(n % 2 == 0)
   return base * base;

这将获得2的每个幂。因此0,2,4,8导致错误的计算。

n <= 0 时,您应该担心的唯一极限案例

以下是更正后的代码:

public static int powerN(int base, int n) {
    if (n < 0) {
        throw new IllegalArgumentException("Illegal Power Argument");
    }
    if (n == 0) {
        return 1;
    } else {
        return base * powerN(base, n - 1);
    }
}

以下是测试:

public static void main(String args[]) throws NullPointerException {
    for (int i = 0; i < 10; i++) {
        System.out.println(powerN(2, i));
    }
}

并输出:

run:
1
2
4
8
16
32
64
128
256
512
BUILD SUCCESSFUL (total time: 1 second)

答案 3 :(得分:1)

在偶数情况下,您需要base = powerN(base, n/2);才能返回。

答案 4 :(得分:0)

为了计算功率,您只需要考虑x ^ 0的特殊情况,对于所有其他(n> 0),您可以使用x * powerN(x,n-1)的递归

答案 5 :(得分:0)

Example 1 : s:59:"[{"item_id":"UTILITY CON CERNIERA","qty":1,"points":"110"}]";

Example 1 : s:109:"[{"item_id":"UTILITY CON CERNIERA","qty":1,"points":"110"},{"item_id":"PESA VALIGIA","qty":1,"points":"120"}]";

答案 6 :(得分:0)

以下是C ++中的答案,这是一系列的^ b =

int power(int a, int b)
{
   int k = a;
   int c = b;
   if (c == 1)
    {
        return a;
    }
   else if (c == 0)
    {
        return 1;
    }
   else if (c >= 1)
   {
        c--;
        k = k*power(k,c);
   }
   cout << k << endl;
   return k;

}

int main()
{
    cout << "Enter a number " << endl;
    int n;
    cin >> n;
    cout << "Enter power " << endl;
    int c1 = 0;
    cin >> c1;
    cout << endl ;
    cout << "These are all the powers up to " << n << " to the power " << c1 << endl;
    power(n,c1);
    return 0;
}

答案 7 :(得分:0)

public static int powerN(int base, int n ){
    if (n==0){
        return 1;
    }else
        return base*powerN(base,n-1);
}

答案 8 :(得分:-1)

您的问题是代码

if(n%2 == 0)      返回基数*基数;

这使得你的函数返回基数的平方,即幂(n)是偶数和立方数,只要它是奇数。 你需要的唯一终止条件是n == 0返回1并且它应该适用于你的基本指令到递归的幂n

答案 9 :(得分:-1)

public int powerN(int base, int power) {
    if (power == 1)
        return base;
    else if (power % 2 == 0) {
        int x = powerN(base, power / 2);
        return x * x;
    } else {
        int x = powerN(base, (power - 1) / 2);
        return x * x * base;
    }
}