Цикл без цикла?

#java #recursion

#java #рекурсия

Вопрос:

Я надеялся, что кто-нибудь сможет взглянуть на это для меня. Я только начал с Java, и это мой первый проект, но в нем есть странная ошибка, которую я не могу понять.

Предполагается, что метод просто возвращает true или false в зависимости от того, что вводит пользователь. Это действительно работает, единственное, что запрашивает пользователя дважды. Он принимает входные данные, но затем запрашивает снова и выполняет оценку для второго ввода. Я не уверен, как это назвать, но если кто-нибудь может сказать, что происходит, я был бы очень признателен!

 public static boolean yesOrNo(){
    System.out.print("Would you like to roll again? Type 'y' for yes or 'n' for no: ");
    char c = screen.next().trim().charAt(0);
    if (c == 'y' || c == 'Y' || c == 'n' || c == 'N') { 
        switch (c) {
        case 'y': return (true);
        case 'Y': return (true);
        case 'n': return (false);
        case 'N': return (false);
        }
    }
    else {
        System.out.println("Invalid input, try again!!");
        yesOrNo();
    }
    return (true);
}
  

редактировать: входные данные для сканера

 public static Scanner screen = new Scanner(System.in);
  

который у меня есть в верхней части программы прямо внутри класса. Похоже, это не вызывает у меня проблем ни в одной из других ситуаций ввода. Он больше ничего не печатает, кроме как запрашивает ввод дважды, хотя я могу поместить оператор печати в, чтобы убедиться, что он получает символ с первого раза. Я также попытался изменить вызов самой функции на

 return(yesOrNo());
  

но не повезло. Есть ли какой-нибудь способ снова вызвать функцию без рекурсии?

Комментарии:

1. Можете ли вы показать определение переменной ‘screen’? Этот код в порядке, нам нужно увидеть больше, например, где вы вызываете yesOrNo(), чтобы найти проблему.

2. Вы упоминаете, что он дважды спрашивает вас, печатает ли он «Неверный ввод, повторите попытку» в первый раз или нет?

3. Не используйте здесь рекурсию.

4. Вы обнаружили рекурсию (я полагаю, скорее случайно, чем намеренно). Посмотрите на свой код, в else случае повторного вызова yesOrNo() . Если вы новичок, просто проигнорируйте это на данный момент и посмотрите на это позже, когда у вас будет немного больше опыта.

Ответ №1:

Хорошо, то, что вы делаете в другом месте, где вы вызываете yesOrNo() изнутри yesOrNo(), является рекурсией.

Чтобы исправить, вам нужно вернуть ответ из следующего вызова;

 else {
    System.out.println("Invalid input, try again!!");
    return yesOrNo();
}
  

Ответ №2:

в вашем else вы снова вызываете метод.

      else {
    System.out.println("Invalid input, try again!!");
    yesOrNo();
      }
  

Ответ №3:

Здесь вы можете использовать while цикл, а не рекурсию.

 public static boolean yesOrNo(){
    boolean run = true;

    while(run){
        System.out.print("Would you like to roll again? Type 'y' for yes or 'n' for no: ");
        char c = screen.next().trim().charAt(0);

        if (c == 'y' || c == 'Y' || c == 'n' || c == 'N') { 
            switch (c) {
                case 'y': return true;
                case 'Y': return true;
                case 'n': return false;
                case 'N': return false;   
            }
            run = false;
        }
        else {
            System.out.println("Invalid input, try again!!");
        }
    }
    return true;
}