Итак, вот мой код:

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), и это дает мне ошибку о статической переменной.

-2
Astrum 6 Сен 2016 в 06:06

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.

2
ajb 6 Сен 2016 в 03:37
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 в последней строке функции;

0
Zeeshan Afzal Satti 6 Сен 2016 в 03:38

Вопрос 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   

 }
2
Community 20 Июн 2020 в 09:12