我写了一个检查数字是否为素数的方法:
static boolean isPrime(int x) {
for (int i = 2; i <= Math.sqrt(x); i++) {
if (x % i == 0)
return false;
}
return true;
}
在我们正在学习的一系列练习中,解决方案是:
static boolean isPrime(int x) {
boolean hasDivisors = false;
for (int i = 2; i <= Math.sqrt(x); i++) {
if (x % i == 0) {
hasDivisors = true;
break;
}
}
return !hasDivisors;
}
在我的情况下,如果我找到一个除数,我会返回该数字不是素数(return false
)并且替换了第二种方法中break
的需要。唯一明显的原因是第二种方法只使用一个return
语句。
这是否有原因(速度/记忆明智)?
答案 0 :(得分:5)
这主要是风格问题。某些编码约定规定方法只有一个return
语句。这在您必须明确释放资源的语言中很有意义,但在Java中没有任何功能影响。
就个人而言,只要您知道结果,我就更喜欢return
(就像在第一个片段中一样),但同样,这是个人风格的问题。
答案 1 :(得分:3)
这两种解决方案都有效,并且两者都有效,因为您已经确定了所有原因。好的分析。正如其他人所指出的,差异纯粹是风格上的。这是一个interesting discussion about the single return statement style in java。
在性能方面,我不希望两种方法之间存在显着差异。但如果您想确定,请执行基准测试。如果您希望获得真正的性能提升,可以通过替换以下内容来消除对Math.sqrt()
的昂贵调用:
for (int i = 2; i <= Math.sqrt(x); i++) {
与
for (int i = 2; i*i <= x; i++) {