Entendendo a recursão no exemplo da garrafa de cerveja

Eu estou praticando recursão em C por conta própria e encontrei este exemplo online. No entanto, há uma coisa que não entendo.

void singSongFor(int numberOfBottles)
{
if (numberOfBottles == 0) {
    printf("There are simply no more bottles of beer on the wall.\n\n");
} 
else {
    printf("%d bottles of beer on the wall. %d bottles of beer.\n",
           numberOfBottles, numberOfBottles);
    int oneFewer = numberOfBottles - 1;
    printf("Take one down, pass it around, %d bottles of beer on the wall.\n\n",
           oneFewer);
    singSongFor(oneFewer); // This function calls itself!

    // Print a message just before the function ends
    printf("Put a bottle in the recycling, %d empty bottles in the bin.\n",
             numberOfBottles);
   }
}    

Então eu uso um método principal como tal:

 int main(int argc, const char * argv[])
{
  singSongFor(4);
  return 0;
}

E a saída é assim:

4 garrafas de cerveja na parede. 4 garrafas de cerveja. Tome um para baixo, passe-o ao redor, 3 garrafas de cerveja na parede.

3 garrafas de cerveja na parede. 3 garrafas de cerveja. Pegue um para baixo, passe-o, duas garrafas de cerveja na parede.

2 garrafas de cerveja na parede. 2 garrafas de cerveja. Pegue um para baixo, passe-o, 1 garrafa de cerveja na parede.

1 garrafas de cerveja na parede. 1 garrafas de cerveja. Pegue um para baixo, passe-o, 0 garrafas de cerveja na parede.

Simplesmente não há mais garrafas de cerveja na parede.

Coloque uma garrafa na reciclagem, 1 garrafas vazias no lixo.

Coloque uma garrafa na reciclagem, 2 garrafas vazias no lixo.

Coloque uma garrafa na reciclagem, 3 garrafas vazias no lixo.

Coloque uma garrafa na reciclagem, 4 garrafas vazias no lixo.

Eu entendo a primeira parte muito bem até chegar a "Simplesmente não há mais garrafas de cerveja na parede. Eu não entendo depois como o número variável de garrafas é incrementado de 1 até 4.

questionAnswers(7)

yourAnswerToTheQuestion