我正在写一本书,其中有一章涉及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
的嵌套调用。最后,函数返回时不进行递归,堆栈上等待的所有副本将一次返回一个。