所以这是我的代码:
public class Bob {
public static int F(int n) {
if (n > 1) {
if (n % 2 == 0) {
n = n / 2;
System.out.println(n);
return F(n);
} else if (n % 2 != 0) {
n = 3 * n + 1;
System.out.println(n);
return F(n);
} else {
System.out.println("Complete");
return 0;
}
}
public static void main(String[] args) {
int result = F(10);
System.out.println(result);
}
}
我似乎无法找到错误的位置。涵盖了n的所有可能值。如果我在if-statment之外添加一个简单的返回值,它将起作用,但我不明白为什么会出现这种情况。
另外,我想在main中添加一个打印“i”语句,但只要我这样做:
if (something){
int i;
i++;
do something
我尝试添加一个System.out.println(i),它给我一个关于静态变量的错误。
答案 0 :(得分:2)
问题1
您必须在方法中添加return;
语句,因为它可能永远不会输入if
语句。编译器不知道您将调用该方法的变量:
返回某些内容;
你也错过了一个支架
else{ System.out.println("Complete"); return 0;}
如果你想使用最后的else作为返回点,那么你的方法必须是这样的:
public static int F(int n) {
if (n > 1) {
if (n % 2 == 0) {
n = n / 2;
System.out.println(n);
return F(n);
} else if (n % 2 != 0) {
n = 3 * n + 1;
System.out.println(n);
return F(n);
}
} else {
System.out.println("Complete");
return 0;
}
}
问题2
如果静态方法超出方法范围,则不允许使用非静态方法。这导致静态方法的加载速度更快,非静态的简单方法和变量可能尚未初始化。
我的意思是:(不允许)
int b;
public static void main (String[ ] args){
// variable ( b) has to be static to be used here
}
答案 1 :(得分:2)
你的代码毫无意义,如发布的那样。您有一个带有三个分支的if/else
语句。如果n%2
为0,则执行第一个分支。如果n%2
不为零,则执行第二个分支。由于这涵盖了所有可能性,第三个分支什么时候应该被执行?
因为这没有意义(并且因为之前我已经看过这个编码问题),我怀疑如果第一个if
为假,你意味着要执行第三个分支,即如果n <= 1
。但由于花括号,编译器会附加&#34; else&#34;到if (n%2...)
分支,而不是if (n > 1)
。要解决这个问题,你需要另一个大括号:
public static int F(int n){
if (n > 1){ // ***** Opening brace 1
if (n%2 == 0){
n = n/2;
System.out.println(n);
return F(n);
} else if(n%2 != 0){ // ***** Opening brace 2
n = 3*n+1;
System.out.println(n);
return F(n);
} // This curly brace matches "opening brace 2"
} // This curly brace matches "opening brace 1"
else {
System.out.println("Complete");
return 0;
}
}
但这仍然不合法,原因并不明显。这里发生的是Java要求您在每个可能的路径中都有return
语句。以下是编译器的想法:如果n > 1
,那么您有一个if
语句if (n%2 == 0)
。如果失败,则转到if
语句if (n%2 != 0)
。如果这也是假的,那么它将下降到最后else
部分之后,它将到达方法的末尾而不返回任何内容。
当然,你和我会看着它并说,这是不可能的,因为n%2 == 0
或n%2 != 0
必须是真的。但这需要我们做一些推理。 Java编译器不做这种推理,所以它不能告诉那两个if
表达式中的一个必须是真的。
所以解决这个问题也需要你改变
} else if(n%2 != 0) {
到
} else {
无论如何你都不需要if
- 它完全是多余的。如果我们到达此处,我们就已经知道n%2 != 0
。
答案 2 :(得分:0)
public static int F(int n) {
if (n > 1) {
if (n % 2 == 0) {
n = n / 2;
System.out.println(n);
return F(n);
} else if (n % 2 != 0) {
n = 3 * n + 1;
System.out.println(n);
return F(n);
} else {
System.out.println("Complete");
return 0;
}
}
错误缺少返回语句是因为如果n小于1,则不指定return语句。那么,如果提供的参数 n 小于1就像0.您应该在else语句中指定它,或者甚至在函数的最后一行使用单个return语句,如 return -1 ;