Proszę wyjaśnić działanie instrukcji rekursji w poniższym kodzie.Rekursja w Javie Jak to działa?
int factR(int n) {
int result;
if(n==1) return 1;
result = factR(n-1) * n;
return result;
}
Moje zrozumienie jest, że:
W powyższym stwierdzeniem metoda factR(n-1)
nazywa się aż do końca. Załóżmy, że chcemy uzyskać silnię z 6, która zostanie wysłana do tej metody jako argument. Zostanie odebrany jako parametr n
, a następnie zostanie sprawdzona wartość n
; jeśli jest 1, to zostanie zwrócone 1. Ale jeśli nie jest 1, tak jak w naszym przypadku, gdzie jest 6, wtedy instrukcja rekursji będzie działać.
Problem polega na tym, że po raz pierwszy n-1
staje się 5 i jest mnożony przez n, który przechowuje wartość 6, następnie staje się 30. Teraz gdzie to będzie 30 GO?
Następnie metoda wywoła samą siebie i tym razem n-1
staje się 4, a następnie mnoży się z n
, która IF ma wartość "6", a następnie 4 * 6 = 24, co moim zdaniem jest błędne. Ponieważ jeśli przejdziemy tą drogą, to w następnym wywołaniu proces będzie podobny, n-1
stanie się 3 * n, który JEŻELI będzie miał taką samą wartość, tj. 6, wtedy stanie się 3 * 6 = 18. Wtedy pojawi się następne połączenie i n-1
staje się 2, jeśli pomnożymy i przypuśćmy, że n
ma wartość 6, a następnie 2 * 6 = 12, a na końcu wywołanie n-1
= 1 * n = 6. Mój punkt jest taki, że jest jasne, że n-1
zmniejszy wartość n-1
, tj. 6-1 = 5, następnie 5-1 = 4, następnie 4-1 = 3, następnie 3-1 = 2 i 2-1 = 1. ALE pytanie brzmi, jaka będzie wartość n
, która będzie mnożona za każdym razem, gdy sama metoda wywoła?
Jeśli powiesz, że gdy pojawi się pierwsze mnożenie, tj. "N-1" stanie się 5, pomnożone przez 6 = 30, a 30 zostanie zapisane w "n", a następnie w następnym wywołaniu 5-1 = 4 * 30 = 120 , następnie 4-1 = 3 * 120 = 360, następnie 3-1 = 2 * 360 = 720, a na końcu 1 * 720 = 720, to w jaki sposób Java określa, aby umieścić wynikową wartość z powrotem w zmiennej n
?
Gdybym miejsce innego komunikatu, by sprawdzić jaka jest wartość zmiennej result
każdym razem metoda nazywać się w ten sposób, jak to:
int factR(int n) {
int result;
if(n==1) return 1;
result = factR(n-1)*n ;
System.out.println(result);
return result;
}
Potem dostać wyjście:
2
6
24
120
720
Factorial of 6 is 720
Nie rozumiem, jak produkuje 2 w pierwszym wywołaniu. Skąd bierze się wartość 2, a następnie 6, 24, 120 i 720? Myślę, że poważnie utknąłem w działaniu kodu.
Czy próbowałeś debugować kod? – TheLostMind
jesteś w złym kierunku. W twoim przypadku nie dostaniesz "30" jako pierwszego. Zacznie się od '1 * 2' -> Przekaż wynik do metooka wywołującego' * 3' -> Przekaż wynik do metody wywołującej '* 4' i tak dalej. Każde wywołanie wywołania rekursji jest umieszczane na stosie, który cofa się od początku (ostatniego wywołania) do dołu (pierwsze wywołanie), gdy osiągnie punkt, w którym nie wykonuje żadnej dalszej rekursji. – SomeJavaGuy
2 nie jest pierwszym połączeniem, jest drugim, po prostu pierwsze wywołanie zwraca przed drukiem – valepu