我正在编写一个函数,该函数给了我最大的因素,即一个数字的质数。例如,数字12会给我3。我的初始代码是:
public static int getLargestPrime(int number) {
if (number < 2) {
return -1;
}
for (int num = 2; num <= number; num++) {
int mod = number % num;
if (mod == 0) {
int div = number / num;
if (div == 1) {
return number;
} else {
number = div;
num = 1;
}
}
}
}
但是我一直遇到丢失的return语句错误,因此我添加了一个:
public static int getLargestPrime(int number) {
if (number < 2) {
return -1;
}
for (int num = 2; num <= number; num++) {
int mod = number % num;
if (mod == 0) {
int div = number / num;
if (div == 1) {
return number;
} else {
number = div;
num = 1;
}
}
}
return number;
}
现在是正确的,但我不太了解其背后的逻辑。我已经读过,在某些情况下循环将不会执行,因此即使我的循环未执行,我也需要返回一些内容,但是我无法想到在任何情况下循环都不会执行。从字面上看,大于等于2的任何东西都会触发循环,小于2的任何东西都会返回-1。所以我的问题是在什么情况下循环将不会执行?而且,for循环之后的return语句实际上没有意义,是否有更好的方法来解决丢失的return语句?
答案 0 :(得分:1)
在您的初始代码中:
if (div == 1) {
return number;
} else {
number = div;
num = 1;
}
}
万一您总是有假的话,就永远不会到达return语句。 编译器无法预测它是否会真正发生,因此它在if和else块中都需要return语句。因此,它实际上与for循环无关。
答案 1 :(得分:0)
两个建议 1.最好不要更改您传递的参数(在这种情况下为数字变量) 2.尽可能少的返回语句。
在您的情况下,您可以在for-lopp之外声明另一个变量tempNumber,并为其分配“ number”。在您要返回的if条件下,您会“中断”。在函数末尾返回数字。这样总是返回数字
public static int getLargestPrime(int number) {
if (number < 2) {
return -1;
}
int tempNumber = number;
for (int num = 2; num <= tempNumber; num++) {
int mod = tempNumber % num;
if (mod == 0) {
int div = tempNumber / num;
if (div == 1) {
break;
} else {
tempNumber = div;
num = 1;
}
}
}
return tempNumber;
}
答案 2 :(得分:0)
我想不出循环不会执行的任何情况
必须以有效且定义明确的方式编写方法。将其视为帮助编译器的一种形式。
在编译时检查return
语句的存在。如果编译器发现一个可能的执行分支未以有效的return语句(或显式引发的异常)结尾,则它会出错。 Read more。
甚至...
int method() {
if (true)
return 1;
}
...将无法使用
进行编译 This method must return a result of type int
答案 3 :(得分:0)
https://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.14
Java编译器不会在循环内验证您的代码,因此您需要在所有fork中放入return语句。 覆盖率测试会警告您,因为您的代码无法访问,因此需要重新计划代码。
注意:您需要检查prime test直到等于Math.sqrt(number)
,如果大于不带分隔符的sqrt,则可以中断循环并返回number