BeerSong из книги Objective-C Programing: The Big Nerd Ranch Guide 2ed - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Всем доброго времеи суток! Сразу скажу, в книге "Objective-C Programing: The Big Nerd Ranch Guide 2ed", авторы для начала обучают обычному Си и у меня вопрос косательно "волшебной программы" написанной имнно в Си. Однако, сама книга про Objective-C для чайников - таких как я. Вот сама программа..
#include <stdio.h>
 
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;
}
Этот код из главы про Recursion и Stacks. Если честно, я так и не понял, что же такое recursion? Но, главный вопрос у меня косательно другого... Если вы скомпелируете программу, то на выходе получите:

4 bottles of beer on the wall. 4 bottles of beer. Take one down, pass it around, 3 bottles of beer on the wall. 3 bottles of beer on the wall. 3 bottles of beer. Take one down, pass it around, 2 bottles of beer on the wall. 2 bottles of beer on the wall. 2 bottles of beer. Take one down, pass it around, 1 bottles of beer on the wall. 1 bottles of beer on the wall. 1 bottles of beer. Take one down, pass it around, 0 bottles of beer on the wall. There are simply no more bottles of beer on the wall. Put a bottle in the recycling, 1 empty bottles in the bin. Put a bottle in the recycling, 2 empty bottles in the bin. Put a bottle in the recycling, 3 empty bottles in the bin. Put a bottle in the recycling, 4 empty bottles in the bin. Program ended with exit code: 0

Я НЕ МОГУ ПОНЯТЬ ПОЧЕМУ СООБЩЕНИЕ ПРО Recycling ПЕЧАТАЕТСЯ В КОНЦЕ, ДА ЕЩЕ И ЧЕТЫРЕ РАЗА??? Исходя из моей логики когда numberOfBottles = 0, программа повторяя себя выводит: There are simply no more bottles of beer on the wall. и дальше просто возвращается не оброщая внимания на "else". Единственное объяснение которое я нашел для себя, это то, что когда программа возвращает каждый stack, то она каким-то оброзом запускает else statement с кодом который ранее не был запущен, при этом пропуская все остальное....??? O_O Но, мне все равно не понятно почему так? ПОЧЕМУ ОНА ВЫДАЕТ Put a bottle in the recycling, 1 empty bottles in the bin. В САМОМ КОНЦЕ И АЖ ЧЕТЫРЕ РАЗА? Объясните на пальцах пожалуйста! Спасибо!!!

Решение задачи: «BeerSong из книги Objective-C Programing: The Big Nerd Ranch Guide 2ed»

textual
Листинг программы
void singSongFor0(int numberOfBottles)
{
    if (numberOfBottles == 0) {
        printf("There are simply no more bottles of beer on the wall.\n\n");
    } 
}
 
void singSongFor1(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);
        singSongFor0(0); 
        // Print a message just before the function ends
        printf("Put a bottle in the recycling, %d empty bottles in the bin.\n",
               numberOfBottles);
    }
}
 
void singSongFor2(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);
        singSongFor1(1); 
        
        // 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[])
{
    
    singSongFor2(2);
    return 0;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.7 из 5