我正在写一本书,其中有一章涉及C语言中的递归,它将99瓶的歌曲打印到日志中。代码如下:

void singTheSong (int numberOfBottles) {

    if (numberOfBottles == 0) {
        printf("There are no more bottles left.\n");
    } else {
        printf("%d bottles of bear 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", oneFewer);

        singTheSong(oneFewer);
    }
}

int main(int argc, const char * argv[])
{

    singTheSong(99);
    return 0;
}

输出的内容和歌曲的演唱方式一样。我难以理解的是,numberOfBottles变量如何改变其值?我看到它在oneFewer变量中被减去了一个,但是我无法理解它到底是如何工作的。在我看来,日志上写着“墙上有99瓶熊,99瓶啤酒。把一瓶拿下来,传过来,墙上挂着98瓶啤酒。”重复地说,千万不要蘸到98瓶以下。我不确定numberOfBottles值是如何变化的,因此oneFewer如何跟踪瓶子的数量。还有一个问题,我对这个主题的困惑是否是继续编程的坏兆头?我把它钉起来直到现在。

最佳答案

钥匙在这里:

    int oneFewer = numberOfBottles - 1;
    singTheSong(oneFewer);

将生成对singTheSong的新调用,其中numberOfBottles是98而不是99。该函数获取值为98的numberOfBottles的本地副本。
Stack                                  numberOfBottles
------------------------------------------------------
singTheSong                            99
  singTheSong                          98
    singTheSong                        97
      singTheSong                      96
        ...                            ...
          singTheSong                  1
            singTheSong                0

numberOfBottles的值为零时,堆栈上有100个对singTheSong的嵌套调用。最后,函数返回时不进行递归,堆栈上等待的所有副本将一次返回一个。

08-07 20:11