我在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不能在基本情况下执行呢?
答案 0 :(得分:1)
当流程执行到达递归函数调用时,会进行函数调用并从顶部开始(这就是为什么你不看这里打印的数字)。当递归调用到达函数的最后一个语句时,执行流程将转移到调用者语句下面的下一个语句(在这种情况下该语句为cout << begin << endl;
)这就是为什么在回溯时只看到数字的原因
关于递归的一些参考:
答案 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?