递归示例中的混淆

时间:2016-01-26 10:07:29

标签: c++ recursion

我在讲义中有一个递归的例子

void print(int n)
{
    if (n<1) {return;}
    print(n-1);
    cout<<n;
}

我尝试在DEV C ++中实现此代码,在调试模式下,我发现print函数一次又一次地调用自身,直到n=0。然后转到cout<<n并在n开始收费并显示输出1 2 3 4 5 我不明白为什么它会显示这个输出,在我看来它应该只在输出中显示0

3 个答案:

答案 0 :(得分:4)

程序的执行(从上到下):

print (5)
    if (5<1) {return;} // <-- False; going on
    print (5-1) // print (4)
        if (4<1) {return;} // <-- False; going on
        print (4-1) // print (3)
            if (3<1) {return;} // <-- False; going on
            print (3-1) // print (2)
                if (2<1) {return;} // <-- False; going on
                print (2-1) // print (1)
                    if (1<1) {return;} // <-- False; going on
                    print (1-1) // print (0)
                        if (0<1) {return;} // <-- True; returning
                    cout << 1;
                cout << 2;
            cout << 3;
        cout << 4;
    cout << 5;

答案 1 :(得分:1)

这很简单。它是展开堆栈并打印存储在堆栈中的n的本地副本。让我们一步一步来做: 打印(3); - 3不小于1,因此该功能不会返回 - 然后在下一行中,此函数调用自身,但使用递减的参数 那会发生什么呢?下一个堆栈帧是用n-1值创建的,它是COPIED,然后故事是相同的,它调用print直到n = 0;每次复制n! 所以你在本地n值上有以下堆栈:
1&lt; - 下一个呼叫是print(0),它返回什么都不做 2
3&lt; - 我们从这里开始

所以你然后堆栈被解开了:在打印(n-1)之后它进入下一行,并且在顶部框架中n == 1,然后当下一个堆栈帧被展开并且本地n copy == 2时,然后3,发送到cout的内容。

现在是否清楚?

答案 2 :(得分:1)

每次调用print()时,局部变量的当前值(如n)都存储在堆栈中(调用堆栈 )以及你从中调用它的函数中的位置。

然后,当您从函数返回时,先前的局部变量将从调用堆栈中检索出来,并在您之后立即返回到该函数中的函数你打电话给它。直到你return和你所说的一样多次。

因此,当您致电print()时,n的价值会下降,因为每次调用print()并将n - 1设置为新参数{{1}时},这些值被存储,直到你最终到达n并且这些值开始从调用堆栈中逆序突然显示它们被放置在那里直到你你回来的次数就多了。