我自己在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。

最佳答案

请注意,最后一个printf使用numberOfBottles变量,并且永远不会修改。因此,从打印oneFewer瓶返回后,它将使用numberOfBottles打印回收文本。请记住,每次对函数的调用都有一种不同的局部变量化身。

如果您缩进对函数的调用,可以更容易地看到它:

4 bottles of beer on the wall...
  3 bottles of beer on the wall...
    2 bottles of beer on the wall...
      1 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.

现在,从同一列开始的每一行都是从函数的相同调用中写入的。您看到瓶数和回收币如何吗?那是因为两个都使用相同的变量:numberOfBottles

关于c - 了解啤酒瓶示例中的递归,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20714617/

10-13 08:13