我已经在UVa Online Judge上解决了一个3 * N + 1问题(100),但这是我不明白的一件事,但它与Java有关,我想,不是算法本身。所以这是代码:
private static int maxCycleLength(int lo, int hi) {
maxLength = 0;
int n = 0;
int length = 0;
for (int i = lo; i <= hi; i++) {
// It's the first time we're computing the cycle length for n
if (lengths[i] == 0) {
n = i;
length = 1;
while (n != 1) {
if ((n % 2) == 0) {
n = n >> 1;
length++;
}
else {
n = 3 * n + 1;
n = n >> 1;
length += 2;
}
}
lengths[i] = length;
}
// Otherwise we just look it up
else
length = lengths[i];
// Check if the current cycle length is the maximum
if (length > maxLength)
maxLength = length;
}
return maxLength;
我不明白的地方:我的IDE(IDEA)告诉我,在这段代码中,变量n
和length
的初始化是多余的,但是, maxLength
必须初始化,如果我不这样做,它就不会编译。
为什么这样? maxLength
与n
length
有什么不同?
答案 0 :(得分:2)
在所有代码路径上,在尝试从中读取值之前,先初始化n
和length
。无论发生什么,最初分配给它们的值都不会被使用,因为在您需要之前,您将用其他内容覆盖它。
maxLength
虽然在您为其分配新值之前,在进行length > maxLength
比较时,或在return
中,如果for
循环是跳过。由于它在第一遍中没有值,你需要给它一个起始值来使用。
答案 1 :(得分:1)
maxLength
不同,因为它的值在for循环之外使用。如果从未输入for循环,则永远不会初始化maxLength
(如果在开始时删除初始化),则return语句将变为无效。
其他两个变量(n
和length
)保证在访问之前分配,即使在删除初始初始化之后也是如此。它们不在for循环外访问,而在for循环内,if
和else
子句都是从初始化length
开始的。 n
仅由if
cluase初始化,但只能在该子句中访问。