帮忙看下c++中递归问题

来源:百度知道 编辑:UC知道 时间:2024/06/08 06:32:52
#include <iostream>
using namespace std;
void countdown(int n)
{
cout << "counting down.... " << n << endl;
if(n>0)
countdown(n-1);
cout << n <<": kaboom.\n";
}
int main()
{
countdown(4);
return 0;
}
输出结果是:
counting down.... 4
counting down.... 3
counting down.... 2
counting down.... 1
counting down.... 0
0: kaboom.
1: kaboom.
2: kaboom.
3: kaboom.
4: kaboom.
我想问一下
0: kaboom.
1: kaboom.
2: kaboom.
3: kaboom.
4: kaboom.
这几个是怎么出来的 我怎么认为只运行了一次 得到 0: kaboom.这个结果

这是函数递归引用,递归引用的时候就会保护现场。具体来说就是进栈和出栈
堆栈如下:
countdown(0)
countdown(1)
countdown(2)
countdown(3)
countdown(4)
main()

每次countdown(int n)函数进栈都是执行到if(n>0) 语句,而语句cout << n <<": kaboom.\n"却没有执行,
而在countdown(int n)函数出栈的时候才会执行语句cout << n <<": kaboom.\n"。
出栈顺序是由countdown(0)到countdown(4) ,所以就这结果了!

应该有4次的,跟counting down一样的嘛
只是一个在递归调用前,一个在递归调用后,但都要被执行的

应该是这几个值啊,递归就是实现反复的调用自身,当条件满足时退出。
先是执行countdown(4),嵌套countdown(3),countdown(2),countdown(1),
....
再向回执行,然后退出。

以下是执行顺序,没有缩进的表示在f(0)中执行,缩进2个空格的是在f(1)中执行,依次类推,else 中的for循环在 f(1), f(2)中经常会因为if(!used[i])而跳过,只要注意到这一点,就很清楚了!
希望能帮到你..

因为
if(n>0)
countdown(n-1);
cout << n <<": kaboom.\n";
cout<<这一句不管n是否大于0都要运行,要得到你需要的结果,你需要加个else

if(n>0)
countdown(n-1);
else cout << n <<": kaboom.