Пожалуйста, объясните работу оператора рекурсии в следующем коде.Рекурсия в Java Как это работает?
int factR(int n) {
int result;
if(n==1) return 1;
result = factR(n-1) * n;
return result;
}
Я понимаю, что:
В приведенном выше заявлении метод factR(n-1)
не называет себя до конца. Предположим, мы хотим получить факториал из 6, который будет отправлен на этот метод в качестве аргумента. Он будет принят как параметр n
, и тогда будет проверено значение n
; если оно равно 1, то 1 будет возвращено. Но если это не 1, как в нашем случае, когда оно равно 6, то будет выполняться инструкция рекурсии.
Теперь проблема, с которой я сталкиваюсь, заключается в том, что первый раз n-1
становится 5 и умножается на n, что содержит значение 6, тогда оно становится 30. Теперь, где будет 30 GO?
Тогда метод будет называть себя и на этот раз n-1
становится 4, а затем умножается на n
, который IF имеет значение «6», а затем 4 * 6 = 24, которое, я думаю, неверно. Потому что если мы пройдем через этот путь, то в следующем вызове процесс будет чем-то вроде: n-1
станет 3 * n, который IF имеет то же значение, то есть 6, тогда он станет 3 * 6 = 18. Затем произойдет следующий вызов и n-1
становится равным 2, если мы умножим и предположим, что n
имеет значение 6, затем 2 * 6 = 12, и при последнем вызове n-1
= 1 * n = 6. Моя точка зрения заключается в том, что ясно, что n-1
уменьшит значение n-1
, т.е. 6-1 = 5, затем 5-1 = 4, затем 4-1 = 3, затем 3-1 = 2 и 2-1 = 1. НО вопрос в том, что будет значением n
, которое будет умножаться каждый раз, когда метод называет себя?
Если вы говорите, что когда происходит первое умножение, т.е. «n-1» становится 5, то умножается на 6 = 30 и что 30 сохраняется в «n», а затем в следующем вызове 5-1 = 4 * 30 = 120 , затем 4-1 = 3 * 120 = 360, затем 3-1 = 2 * 360 = 720 и, наконец, 1 * 720 = 720, то как Java определяет, чтобы вернуть полученное значение обратно в переменную n
?
Если я помещаю еще одно заявление, чтобы проверить, что значение переменной result
каждый раз, когда метод называют себя таким образом, как это:
int factR(int n) {
int result;
if(n==1) return 1;
result = factR(n-1)*n ;
System.out.println(result);
return result;
}
Тогда я получаю этот выход:
2
6
24
120
720
Factorial of 6 is 720
Я не понимаю, как он производит 2 в своем первом вызове. Откуда взялось значение 2, а затем 6, 24, 120 и 720? Я думаю, что я сильно застрял в работе с кодом.
Вы попробовали отладить код? – TheLostMind
Вы ошибаетесь. В вашем случае он не получил бы «30» первым. Он должен начинаться с '1 * 2' -> передать результат методу вызова' * 3' -> передать результат методу вызывающего абонента '* 4' и т. Д. Каждый вызов рекурсивного вызова помещается в стек, который возвращается полностью из верхнего (последнего вызова) в нижний (первый вызов), когда он достигает точки, в которой он не делает никакой дальнейшей рекурсии. – SomeJavaGuy
2 не первый вызов, это второй, это просто, что ваш первый вызов делает возврат до println – valepu