Para ficar mais claro, vou usar a seguinte nomenclatura nos comentário: n-x, onde “n” representa a quantidade de vezes que a recusividade ocorreu e “x” é uma instrunção dentro do corpo do método
Primeira execução:
public static void ex233(6) {
if (n <= 0) return;
StdOut.println(6);
ex233(4);//1-a
ex233(3);//1-b
StdOut.println(6);//1-c
}
Isso imprime: 6
//1-a
public static void ex233(4) {
if (n <= 0) return;
StdOut.println(4);
ex233(2);//2-a
ex233(1);//2-b
StdOut.println(4);//2-c
}
Isso imprime: 4
//2-a
public static void ex233(2) {
if (n <= 0) return;
StdOut.println(2);
ex233(0);//3-a
ex233(-1);//3-b
StdOut.println(2);3-c
}
Isso imprime: 2
Perceba no último caso, que as chamada 3-a e 3-b não retornam nada; logo, 3-c é chamado e novamente 2 é impresso na tela. Agora, 2-b é chamada. Assim:
//1-b
public static void ex233(1) {
if (n <= 0) return;
StdOut.println(1);
ex233(-1);//4-a
ex233(-2);//4-b
StdOut.println(1);//4-c
}
Isso imprime: 1
Novamente, as chamadas às funções 4-a e 4-b não retornam nada. 4-c é chamamada e 1 é novamente impresso na tela. Agora, 1-b é chamada:
//1-b
public static void ex233(3) {
if (n <= 0) return;
StdOut.println(3);
ex233(1);//5-a
ex233(0);//5-b
StdOut.println(3);//5-c
}
Isso imprime 3 na tela; agora 5-a é chamada:
//5-a
public static void ex233(1) {
if (n <= 0) return;
StdOut.println(1);
ex233(0);//6-a
ex233(-1);//6-b
StdOut.println(1);//6-c
}
Isso imprime: 1. 6-a e 6-b não retornam nada. 6-c é chamada e novamente 1 é impresso na tela. 5-b não retorna nada. 5-c é chamada e 3 é impresso na tela.
Retornando agora para a 1-c, agora 6 é impresso na tela.
No fim de tudo, isso imprime na tela a sequencia que você mostrou como resultado da recursão.
Minha explicação não tá muito boa mas acho que dá pra entender. Qualquer coisa grita ai.
Abs.