Я занимаюсь рекурсией в C самостоятельно, и я нашел этот пример онлайн. Однако есть одна вещь, которую я не понимаю.Понимание рекурсии в примере с бутылкой пива
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.
Таким образом, понятие рекурсии всегда включает в себя стек в качестве структуры данных, или это просто способ объяснить механизм обратной вперед цикла? Стек довольно ясная. Это относится к любому языку программирования? – Ralph
Да, они всегда будут стеком (что-то вроде - оптимизации могут изменить это при определенных обстоятельствах)). Когда вы вызываете другую функцию, состояние внешней функции должно быть сохранено, поэтому ее можно возобновить, когда внутренняя функция завершится. Это делается со стеком на любом языке (опять же, если он не оптимизируется по-другому, но он все равно работает одинаково). –