У меня есть этот код, и мне просто интересно, насколько я понимаю это правильно.
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;
}
}
}
Ваше понимание верное. Вы можете убедиться в этом сами, выполнив код в отладчике.
Я оставил код нечистым, чтобы сделать как можно меньше изменений в OP-коде, насколько это возможно. Для дополнительного кредита вы можете попытаться упростить все/все приведенные выше примеры, чтобы они не использовали блокировки if и else, а просто имели один блок if, а также избавлялись от всех операторов return.
Удачи, и получайте удовольствие от кодирования. :)
Да, ваше понимание правильное.
Однако одно уточнение
Я думаю, вы уже знаете это, но ваш код не будет печатать 1
. Он напечатает:
2
3
4
5
Если вы хотите также напечатать 1, вы можете исправить это тремя способами
Изменить n==1
условие на n==0
. Это то, что я сделал бы. Это самый простой и самый естественный для меня.
public static void numbers (int n){
if(n==0) return;
else{
numbers(n-1);
System.out.println(n);
return;
}
}
Переместите печать перед условным
public static void numbers (int n){
System.out.println(n);
if(n==1) return;
else{
numbers(n-1);
return;
}
}
Теперь вы можете догадаться, что это напечатает цифры как
5
4
3
2
1
Выполните печать в обоих случаях, но после блока 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);
}
if
? Yucko! Намного чище просто делать, if (n > 1) { numbers(n-1); }
сопровождаемый вашим println
.
Ваше понимание и код верны. Все, что я хотел бы предложить, - нет необходимости использовать оператор 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);
}
}
}
n < 0
? :)else {
иreturn
внутриelse {
избыточен.