Это происходит потому, что состояние вызовов методов хранится в стеке (называемом «стеком вызовов»).
Как вы, возможно, знаете, стек является структурой данных First In Last Out.Это означает, что если вы положите предметов A, B, C и D в стек по порядку, первым элементом, который вы извлечете из стека, будет D, а последним элементом, который вы выберете, будет A.
Каждый раз, когда вы вызываете метод B из метода A, B помещается в стек вызовов и садится на вершину A. B сделает свое дело, а когда он вернется, он вытолкнут из стека, и A продолжитс тем, что он делал.
Следовательно, первый вызов gcd
будет сделан последним, а последний вызов - первым, а все между ними будет перевернуто.
Это поведениеможет быть «смоделирован» с помощью java.util.Stack
:
Stack<String> stack = new Stack<>();
for(int i = 0 ; i < 5 ; i++) {
// simulating calling gcd recursively
String s = "Call #" + i + " of gcd";
stack.push(s);
System.out.println(s);
}
for (int i = 0 ; i < 5 ; i++) {
// simulating returning from all the calls to gcd
System.out.print("Returning from ");
System.out.println(stack.pop());
}
И он печатает:
Call #0 of gcd
Call #1 of gcd
Call #2 of gcd
Call #3 of gcd
Call #4 of gcd
Returning from Call #4 of gcd
Returning from Call #3 of gcd
Returning from Call #2 of gcd
Returning from Call #1 of gcd
Returning from Call #0 of gcd