Рекурсивный метод в Java

1

У меня есть этот код, и мне просто интересно, насколько я понимаю это правильно.

5 передается в номера методов, а n теперь равно 5. Оператор if является ложным, и поэтому он выполняет оператор else и выполняет numbers(5-1) и снова выполняет номера методов и НЕ распечатывает n или возвращает еще.

Теперь n = 4, и тот же метод повторяется до n = 1, в какой момент он обращается к возврату? и поэтому с этого момента он возвращается туда, где n = 2, следует отпечаткам 2 (часть System.out), а затем возвращается, после чего возвращается в n = 3, печатает 3 и возвращает... и так далее до 5?

Это то, что я думаю, происходит, может кто-то прояснить это для меня, пожалуйста, спасибо!

public class test {

    public static void main(String [] args){

        numbers(5);
    }

    public static void numbers (int n){

        if(n==1) return;
        else{
            numbers(n-1);
            System.out.println(n);
            return;
        }
    }
}
  • 1
    Похоже, ваше понимание правильно - но что происходит, когда n < 0 ? :)
  • 2
    Ваш else { и return внутри else { избыточен.
Показать ещё 10 комментариев
Теги:
recursion

3 ответа

1
Лучший ответ

Ваше понимание верное. Вы можете убедиться в этом сами, выполнив код в отладчике.

  • 2
    Хорошо, попробую отладчик, спасибо!
0

ps (pre-script)

Я оставил код нечистым, чтобы сделать как можно меньше изменений в OP-коде, насколько это возможно. Для дополнительного кредита вы можете попытаться упростить все/все приведенные выше примеры, чтобы они не использовали блокировки if и else, а просто имели один блок if, а также избавлялись от всех операторов return.

Удачи, и получайте удовольствие от кодирования. :)


Да, ваше понимание правильное.

Однако одно уточнение

Я думаю, вы уже знаете это, но ваш код не будет печатать 1. Он напечатает:

2
3
4
5

Если вы хотите также напечатать 1, вы можете исправить это тремя способами

Способ 1

Изменить n==1 условие на n==0. Это то, что я сделал бы. Это самый простой и самый естественный для меня.

public static void numbers (int n){

    if(n==0) return;
    else{
        numbers(n-1);
        System.out.println(n);
        return;
    }
}

Способ 2

Переместите печать перед условным

public static void numbers (int n){

    System.out.println(n);
    if(n==1) return;
    else{
        numbers(n-1);
        return;
    }
}

Теперь вы можете догадаться, что это напечатает цифры как

5
4
3
2
1

Способ 3

Выполните печать в обоих случаях, но после блока if, а не раньше

public static void numbers (int n){

    if(n==1){
        // Do nothing, Don't return yet.
        //return;
    } else{
        numbers(n-1);
        // Don't return yet.
        //return;
    }
    System.out.println(n);
}

п.с.

  • что meriton сказал об использовании отладчика, отладчик - ваш друг. А при кодировании я рекомендую использовать Eclipse или IntelliJ IDEA. Я использовал Eclipse уже много лет, но поскольку Google, похоже, движется к IntelliJ IDEA для Android Development, это тоже может быть полезно.
  • 0
    Пустое условие if ? Yucko! Намного чище просто делать, if (n > 1) { numbers(n-1); } сопровождаемый вашим println .
  • 0
    Я согласен, я пытался изменить как можно меньше кода. Я оставил очистку для ОП в качестве дополнительного кредита. Упоминается как PS. Может быть, я должен переместить это наверх.
0

Ваше понимание и код верны. Все, что я хотел бы предложить, - нет необходимости использовать оператор return в блоке else потому что у вас есть надлежащее условие завершения. Поэтому после модификации код будет таким.

public class test{
    public static void main( String[] args )
    {
       numbers(5);
    }

    public static void numbers (int n){

        if(n==1) return;
        else{
            numbers(n-1);
            System.out.println(n);
        }
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню