以下是我的解决方案:
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。 我知道存在一个更简单的解决方案,但我无法弄清楚为什么这不能正常工作。
答案 0 :(得分:5)
else if(n % 2 == 0)
return base * base;
这个位不正确 - 它返回任何偶数幂的平方,而不仅仅是2.看起来你正在尝试实现square and multiply优化。因此,如果你想计算powerN(base, n)
,你可以利用n
是偶数的事实进行递归调用吗?您会为base
和n
传递哪些新值?使用 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;
}
}