【发布时间】:2019-03-11 22:17:54
【问题描述】:
作业:
编写一个递归函数 recPow,在 Java 中当 n >= 0 时计算 2n。该函数将具有以下配置文件:
public static int recPow(int n)
函数必须考虑所有情况并进行详尽的测试。
我的问题
我不明白为什么当我输入 recPow(31) 而不是 2147483648 时我的代码返回 -2147483648。我知道你们中的一些人可能会告诉我切换到 long 而不是 int,但我相信由于作业的措辞我需要坚持int。如果有人能帮助我理解为什么会发生这种情况,我从来都不是很好的计算数字,我将非常感激。
此外 - 较大的指数返回 0(不过我认为这可能与我们需要使用整数与长整数有关。)
我的代码
public static int baseNum = 2, powResult = 1;
public static int recPow(int n) {
//if the int is not bigger than 0
//must only accept ints
if (n < 0) {
throw new IllegalArgumentException("n has to be > 0");
} else {
//recursion here
//base number = 2
if (n==0) {
return powResult;
} else {
powResult = powResult * baseNum;
return recPow(n - 1);
}
}
}
【问题讨论】:
-
Java 中的最大 int 为 2147483647,因此您不能将 2147483648 的值表示为
int。我会尝试找到一个有用的副本。 -
我认为超过 2^31 是因为 int 的位,例如 2^31 是最大的负数,它的二进制是 10000000,例如 8 位。据我所知,如果你将它乘以 2,你会将它向左移动一级,因此它为零(你只有 8 位)。
-
嗨,谢谢你的回复,我明白了,也许我需要为这种情况做一些例外。对不起,我不明白你所说的有帮助的重复是什么意思?抱歉,这是什么?谢谢
-
@cdm89 "helpful dup" 是一个“很好解释的有用的重复问题”
标签: java tail-recursion pow negative-number