basecase如何影响使用哪些递归函数?

时间:2014-06-08 03:50:13

标签: c++ recursion

我在C ++中有以下用于递归函数的代码。我不明白为什么在满足basecase之前使用basecase之上的所有东西(堆叠?),然后只使用basecase下面的行作为它的unstacking。

#include <iostream>
using namespace std;

void printnum(int begin)
{
    cout << "upanddown";
    cout << begin << endl; //Why is everything this line and above cout'd as it builds the stack and ignored on the unstacking.

    if (begin <= 9) { printnum(begin + 1); } // Once the program starts unstacking the functions, why doesn't it console out "upanddown"?
e
    cout << begin << endl; //Why is everything below the base case only shown as it unstacks?
}

int main()
{
    printnum(1); //First function call, so it starts at one        
    system("PAUSE");
}

结果是:

upanddown1
upanddown2
upanddown3
upanddown4
upanddown5
upanddown6
upanddown7
upanddown8
upanddown9
upanddown10
10
9
8
7
6
5
4
3
2
1
Press any key to continue . . .

为什么upanddown不能在基本情况下执行呢?

3 个答案:

答案 0 :(得分:1)

当流程执行到达递归函数调用时,会进行函数调用并从顶部开始(这就是为什么你不看这里打印的数字)。当递归调用到达函数的最后一个语句时,执行流程将转移到调用者语句下面的下一个语句(在这种情况下该语句为cout << begin << endl;)这就是为什么在回溯时只看到数字的原因

关于递归的一些参考:

Forum

Tutorial

答案 1 :(得分:1)

int main()
{
    printnum(1); //First function call, so it starts at one        
    system("PAUSE");
}

这是你的主要功能。它有两个陈述。 system("PAUSE"),这是printnum(1)返回后执行的尾调用。要知道在哪里继续它会使用堆栈来指示下一步执行的位置,它用于给出函数参数。每次调用都使用堆栈,因此递归函数没什么特别之处。关于它的唯一特殊之处在于它恰好调用自身,但对自身的调用是独立的,当前函数被暂停,直到它像main那样结束。考虑你的递归函数:

void printnum(int begin)
{
    cout << "upanddown";     // 1
    cout << begin << endl;   // 2

    if (begin <= 9)          // 3
    {
        printnum(begin + 1); // 4
    } 

    cout << begin << endl;   // 5
}

那么如果begin是10,会发生什么?它会做1,2,3,而不是4,然后是5。 输出是“upanddowdn10 \ n10 \ n”。

对于begin = 9,它将执行1,2,即“upanddown9 \ n”,然后打印printnum(10)的结果,因为它达到默认情况,然后“9 \ n”是最后打印。因此打印的结果是“upanddown9 \ nupanddowdn10 \ n10 \ n9 \ n”

对于begin = 8,它将执行1,2,即“upanddown8 \ n”,然后打印printnum(9)的结果,因为它达到了默认情况,然后“8 \ n”是最后打印。因此打印结果为“upanddown8 \ nupanddown9 \ nupanddowdn10 \ n10 \ n9 \ n8 \ n”

...

对于begin = 1,它将执行1,2,即“upanddown1 \ n”,然后打印printnum(2)的结果,因为它达到了默认情况,然后“1 \ n”是最后打印。因此,印刷的结果是 “upanddown1 \ nupanddown2 \ nupanddown3 \ nupanddown4 \ nupanddown5 \ nupanddown6 \ nupanddown7 \ nupanddown8 \ nupanddown9 \ nupanddowdn10 \ N10 \ N9 \ n8 \ N7 \ N6 \ N5 \ N4 \ N3 \ N 2 \ N1 \ n” 个

所以回答你的问题。首先完成“Upanddownx \ n”输出,因为它是您的函数中的第一件事。如果begin低于10,则会输出printnum(begin+1)的整个结果。最后它将最后打印“x \ n”。

答案 2 :(得分:0)

只需从代码中删除此行。它会在取消堆栈时获取这些输出。

cout << begin << endl; //Why is everything below the base case only shown as it unstacks?