A chave aqui é empilhar quadros . Vamos dar uma olhada no seu primeiro exemplo:
public static int incrementI(int i) {
if (i == 5){
return i;
} else {
incrementI(i + 1);
}
return i;
}
Na chamada primeiro , você tem uma variável chamada i
, com o valor de 0
. Como i
não é 5, ele chamará incrementI
novamente com 1
.
Desta vez, você tem um novo quadro de pilha e uma variável diferente chamada i
. Toda vez que você chama incrementI
, um novo i
está sendo criado com o novo valor.
Quando você chama incrementI
6 vezes, cada chamada de função tem sua própria cópia de i
:
incrementI: 5
incrementI: 4
incrementI: 3
incrementI: 2
incrementI: 1
incrementI: 0
A função top retorna 5
(como isso é i
), e então a próxima função retorna 4
(já que é sua cópia de i
), até o final função retorna 0
.
No seu segundo exemplo, ocorre a mesma coisa, exceto que cada função está retornando a função acima retornada. Portanto, a função top retorna 5
, então a próxima função retorna 5
( como é o que a função anterior retornou), e assim por diante.