对于某些测试用例,函数未在正确的 return 语句中得到 returned
function not getting returned at a proper return statement for some test cases
这是我的代码。
问题:
我得到的测试用例输出不正确:a=100 b=54。
发现问题:
为什么当调用方法 computeGcd
中的第一个 if
条件时(即当 a==b
或 a
可被 b
整除时)它不是return从这个 if 块回到调用它的 main 方法中的行?
相反,它将转到方法中的最后一个 return 语句,并且从那里 returning 旧值 'b'。我错过了什么?
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
if (a >= b) {
System.out.println("\n\nfinal values are: " + computeGcd(a, b)
+ " for a is=" + a + " and b=" + b);}
else
System.out.println(computeGcd(b, a));
sc.close();
}
public static int computeGcd(int a, int b) {
System.out.println("out side a is=" + a + " and b=" + b);
if (a == b || a % b == 0) {
System.out.println("Inside final : a is=" + a + " and b=" + b);
return b;
} else {
a = (a - b * (a / b));
if (a > b) {
System.out.println("Inside test a>b : a is=" + a + " and b=" + b);
computeGcd(a, b);
}
if (b > a) {
System.out.println("Inside test a<b : a is=" + a + " and b=" + b);
computeGcd(b, a);
}
}
System.out.println("exiting else");
System.out.println("i m here :P ");
return b;
}
调试测试用例:100 54
你的递归调用没有return
。
if (a > b) {
System.out.println("Inside test a>b : a is=" + a + " and b=" + b);
return computeGcd(a, b); // <-- add return
} else { // if (b > a) {
System.out.println("Inside test a<b : a is=" + a + " and b=" + b);
return computeGcd(b, a); // <-- add return
}
或者
最大可能的 gcd 是两项中最小值的平方根。您可以从该值开始并向后迭代。像,
public static int computeGcd(int a, int b) {
if (a == b) {
return a;
}
for (int i = (int) Math.sqrt(Math.min(a, b)); i >= 2; i--) {
if (a % i == 0 && b % i == 0) {
return i;
}
}
return 1;
}
which returns 2
(for 100, 54
) 因为 54
的二分之一是 27
即 33 剩下唯一的共同点是 2 和 1。
这是我的代码。
问题: 我得到的测试用例输出不正确:a=100 b=54。
发现问题:
为什么当调用方法 computeGcd
中的第一个 if
条件时(即当 a==b
或 a
可被 b
整除时)它不是return从这个 if 块回到调用它的 main 方法中的行?
相反,它将转到方法中的最后一个 return 语句,并且从那里 returning 旧值 'b'。我错过了什么?
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
if (a >= b) {
System.out.println("\n\nfinal values are: " + computeGcd(a, b)
+ " for a is=" + a + " and b=" + b);}
else
System.out.println(computeGcd(b, a));
sc.close();
}
public static int computeGcd(int a, int b) {
System.out.println("out side a is=" + a + " and b=" + b);
if (a == b || a % b == 0) {
System.out.println("Inside final : a is=" + a + " and b=" + b);
return b;
} else {
a = (a - b * (a / b));
if (a > b) {
System.out.println("Inside test a>b : a is=" + a + " and b=" + b);
computeGcd(a, b);
}
if (b > a) {
System.out.println("Inside test a<b : a is=" + a + " and b=" + b);
computeGcd(b, a);
}
}
System.out.println("exiting else");
System.out.println("i m here :P ");
return b;
}
调试测试用例:100 54
你的递归调用没有return
。
if (a > b) {
System.out.println("Inside test a>b : a is=" + a + " and b=" + b);
return computeGcd(a, b); // <-- add return
} else { // if (b > a) {
System.out.println("Inside test a<b : a is=" + a + " and b=" + b);
return computeGcd(b, a); // <-- add return
}
或者
最大可能的 gcd 是两项中最小值的平方根。您可以从该值开始并向后迭代。像,
public static int computeGcd(int a, int b) {
if (a == b) {
return a;
}
for (int i = (int) Math.sqrt(Math.min(a, b)); i >= 2; i--) {
if (a % i == 0 && b % i == 0) {
return i;
}
}
return 1;
}
which returns 2
(for 100, 54
) 因为 54
的二分之一是 27
即 33 剩下唯一的共同点是 2 和 1。