我确定这是一个非常基本的问题,但无法理解为什么下面的FOR循环有效?
下面的代码带回了一定数量的Primes,并按原样运行。我理解使用平方根背后的整个数学推理,但我的问题更多的是FOR语句的条件部分。
输入isPrime()
进行检查的第一个参数是2当然是Prime。第一个isPrime()
得到2的平方根,即〜1.4
此时,我感到困惑。从i = 2开始,这显然是>因此,未满足i <= root(即2 <= 1.4)的起始条件。 IF
语句不应该运行, 应该不返回结果,但确实如此。
在我看来,在我到达5之前我不应该得到任何结果,因为2也是&gt;而不是3的平方根。我明显没有低估FOR
语句的初始化或条件方面吗?有人可以帮我逻辑一下吗?
class BooleanTest{
public static void main(String[] arguments) {
int quantity = 10;
int numPrimes = 0;
int candidate = 2; //starting prime #
System.out.println("First " + quantity + " primes:");
while (numPrimes < quantity) {
if (isPrime(candidate)) { //if isPrime Method true
System.out.println(candidate);
numPrimes++;
}
candidate++;
}
}
public static boolean isPrime(int checkNumber) {
double root = Math.sqrt(checkNumber); //get square root of candidate
for (int i = 2; i <= root; i++) {
if (checkNumber % i == 0) { //if remainder of candidate/i = 0
return false; //because candidate is not prime. has factor other than 1 and self.
}
return true;
}
}
答案 0 :(得分:3)
对于输入1,2,3,实际上环路根本不会执行。因此,循环体中的return false
语句也不会被执行。相反,循环之后的return true
语句将被执行,并且对于这些输入,方法调用的结果将为true
。
循环执行的第一个数字是4,方法将正确返回false
,因为4可以除以2。
修复代码缩进使得这种行为更容易看到:
public static boolean isPrime(int checkNumber) {
double root = Math.sqrt(checkNumber); //get square root of candidate
for (int i = 2; i <= root; i++) {
if (checkNumber % i == 0) { //if remainder of candidate/i = 0
return false; //because candidate is not prime. has factor other than 1 and self.
}
}
return true;
}
答案 1 :(得分:0)
root
未初始化为sqrt(2)
,它已初始化为sqrt(checkNumber)
,对于大多数输入,该值大于2。因此,您的So than the starting condition of i <= root (ie 2 <= 1.4) has NOT been met so then the IF statement should not run and I would get no result back
假设是错误的。