Итак, вот мой код:
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, оно будет работать, но я не понимаю, почему это должно быть так.
Кроме того, я хотел бы добавить оператор печати «i» в main, но всякий раз, когда я делаю что-то вроде:
if (something){
int i;
i++;
do something
Я пытаюсь добавить System.out.println (i), и это дает мне ошибку о статической переменной.
3 ответа
Ваш код не имеет смысла, как написано. У вас есть оператор if/else
с тремя ветвями. Первая ветвь выполняется, если n%2
равно 0. Вторая ветвь выполняется, если n%2
не равно нулю. Поскольку это охватывает все возможности, когда должна быть выполнена третья ветвь?
Поскольку это не имеет смысла (и поскольку я видел эту проблему с кодированием раньше), я подозреваю, что вы имели в виду, что третья ветвь будет выполняться, если первое if
ложно, то есть если n <= 1
. Но из-за фигурных скобок компилятор прикрепляет else к ветвям 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
.
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. Итак, что эта функция возвращает, если предоставленный параметр n < / strong> меньше 1, как 0. Вы должны указать это в операторе else или даже с одним оператором возврата, например return -1 в последней строке функции;
Вопрос 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
}
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.