好的,这是我在学习过程中编写的简单代码。

void SingTheSong (int NumOfBottles)
{
    if (NumOfBottles == 0){
        printf("there are simply no more bottles of beer on the wall. \n");
    }

    else {
        printf("%d bottles of beer on the wall, %d bottles of beer.\n", NumOfBottles, NumOfBottles);
        int Bottleless = NumOfBottles - 1;
        printf("Take one down pass it around, %d bottles of beer on the wall. \n", Bottleless);

        SingTheSong(Bottleless);
        printf("Put a bottle in the recycling bin, there are now %d empty bottles in the bin.\n", NumOfBottles);
    }
}

int main(int argc, const char * argv[])
{
    SingTheSong(99);
    return 0;
}


我唯一不明白的是,为什么在程序运行时SingTheSong(Botteless)函数从1开始,为什么在墙上有0瓶啤酒之后却显示printf()语句。只是有点困惑,因为我认为大括号中的所有内容在再次运行else语句之前都会在else语句中被淘汰。为什么不是这样?

例:
“墙上有99瓶啤酒,有99瓶啤酒。把一瓶下来,传给墙壁上有98瓶啤酒。
将瓶子放到回收箱中,现在箱子中有1个空瓶子”
“墙上有98瓶啤酒,有98瓶啤酒。将一瓶下来,传给墙壁上的97瓶啤酒。
将一个瓶子放到回收箱中,现在箱子里有2个空瓶子”

我知道他是初学者,我是初学者。有人可以向我解释这一点,所以我就停止了圈子。谢谢!

最佳答案

想象一下,您知道为SingTheSong打印的N方法。现在分别交易if语句的两个分支。当NumOfBottles为零时,打印“无瓶”消息,然后返回。当NumOfBottles不为零时,我们执行以下三件事:


打印瓶数N
打印SingTheSongN-1打印的任何N方法
打印回收消息N


中间行是递归的:可以将其扩展为相同的三行,如下所示:


打印瓶数N-1
打印瓶数SingTheSong
打印N-2N-1打印的任何N方法
打印回收消息
打印回收消息


您可以一次又一次地执行此操作,直到中间一行变成“啤酒耗尽”消息。

关于c - 99瓶啤酒递归似乎不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13224759/

10-10 22:52