好的,这是我在学习过程中编写的简单代码。
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
打印SingTheSong
为N-1
打印的任何N
方法
打印回收消息N
中间行是递归的:可以将其扩展为相同的三行,如下所示:
打印瓶数N-1
打印瓶数SingTheSong
打印N-2
为N-1
打印的任何N
方法
打印回收消息
打印回收消息
您可以一次又一次地执行此操作,直到中间一行变成“啤酒耗尽”消息。
关于c - 99瓶啤酒递归似乎不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13224759/