Понимание рекурсии на примере пивной бутылки
Я сам практикую рекурсию в Си, и я нашел этот пример в Интернете. Однако есть одна вещь, которую я не понимаю.
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);
}
}
Тогда я использую основной метод как таковой:
int main(int argc, const char * argv[])
{
singSongFor(4);
return 0;
}
И вывод как таковой:
4 бутылки пива на стене. 4 бутылки пива. Сними один, разнеси, 3 бутылки пива на стене.
3 бутылки пива на стене. 3 бутылки пива. Сними один, раздай 2 бутылки пива на стене.
2 бутылки пива на стене. 2 бутылки пива. Сними один, разнеси, 1 бутылка пива на стене.
1 бутылка пива на стене. 1 бутылка пива. Сними один, раздай, 0 бутылок пива на стене.
На стене просто больше нет бутылок пива.
Положите бутылку на переработку, 1 пустую бутылку в мусорное ведро.
Положите бутылку на переработку, 2 пустых бутылки в мусорное ведро.
Положите бутылку на переработку, 3 пустых бутылки в мусорное ведро.
Положите бутылку на переработку, 4 пустых бутылки в мусорное ведро.
Я хорошо понимаю первую часть, пока не дошёл до того, что «на стене просто больше нет бутылок пива. После этого я не понимаю, как переменное количество бутылок увеличивается с 1 до 4».