C++ 为什么递归反向工作?

C++ 为什么递归反向工作?,c++,recursion,C++,Recursion,我很难理解这种递归是如何工作的。 为什么输出显示:cba而不是abc 无效重现(常量字符*sth){ 如果(*sth!=“D”){ 重现(某事物+1); std::cout第一个元素在所有其他元素之后处理。同样,第二个元素在它后面的所有元素之后处理,依此类推 void recur(const char* sth) { if (*sth != 'D') { recur(sth+1); // <- Here you are processing the rest...

我很难理解这种递归是如何工作的。 为什么输出显示:cba而不是abc

无效重现(常量字符*sth){ 如果(*sth!=“D”){ 重现(某事物+1);
std::cout第一个元素在所有其他元素之后处理。同样,第二个元素在它后面的所有元素之后处理,依此类推

void recur(const char* sth) {

    if (*sth != 'D') {
        recur(sth+1); // <- Here you are processing the rest...
        std::cout << *sth << std::endl; // <- ... before processing the current
   }
}
无效重现(常量字符*sth){ 如果(*sth!=“D”){
recur(sth+1);//执行代码的顺序始终很重要。您使用“ABCD”调用recur函数,因此:

如果字符指针不在“D”: ->在您有机会输出当前值之前,使用“BCD”再次调用该函数 位置


只需切换输出和函数调用,就可以了。

在获得所需的输出之前,再次调用函数

因此,当您第一次调用
recur(sth+1)
时,它将进入该函数的下一个“实例”,并将继续求值,直到您失败该条件。当它到达最后一次调用时(在本例中,当您到达
'C'
),则输出将在控制台中打印。然后它将“向后”进行,然后返回到调用,在那里您到达
'B'
,然后它执行下一行。如果不清楚,可能是这个代码解释

void recur(const char* sth) { // value of char* sth is "ABCD"
    if (*sth != 'D'){
        recur(sth+1); // this adjusts the pointer, and calls the function
                      // the current function will branch to a new function
        std::cout << *sth << std::endl; // this line will not execute until the
        // last line has been fully evaluated. This remains true for all calls of recur()
    }
}
void recur(const char*sth){//char*sth的值为“ABCD”
如果(*sth!=“D”){
recur(sth+1);//这将调整指针,并调用函数
//当前函数将分支到新函数

我知道你们中的一些人会建议我使用调试器,但我没有发现任何有助于我理解这一点的东西请解释一下,一行一行地浏览你的代码,如何帮助你理解这一点?因为你在打印任何东西之前进行递归调用——就这么简单。这是递归的一个极好的例子!我们老C/C++程序员把它当作主食,但对于新手来说,它是学习曲线的一大部分!嗯……我错过了一个突破这就是为什么我没有看到所有的重复调用都先结束,然后在终端上打印输出…不管怎样,您的解释帮助了我,所以谢谢:)