c ++:仅停止递归函数的最后一次调用

c++ : stop only last call of recursive function

我有一个递归调用的函数:

void myFunction(int j, int N){
    if(j == N)
        return;
    for(int i = j +1 ; i < N ; ++i){
        myfunction(i);
    }
}

我的问题是 return 将停止完整递归(从第一个调用节点开始),但我希望它只停止最后一个节点。这怎么可能?

编辑:看来我的问题大家看不懂,改一下吧:(不要看代码,只是一个递归的例子函数)

为什么 return 语句会停止递归调用的整个过程?我希望它只停止最后一次通话。

您可以检查该节点是否有子节点,如果没有则退出递归。

void myFunction(int j){
    if(j->next == NULL)
        return;
    for(int i = j +1 ; i < N ; ++i){
        myfunction(i);
    }
}

您可能不想在这样的循环中调用递归函数;更有可能的是,您想用 j + 1:

做点什么
void myFunction(int j, int N) {
    if (j == N) {
        return;
    }
    std::cout << j << std::endl;
    myFunction(j + 1, N);
}

现在,调用 myFunction(0, 10) 将按升序打印数字 09

return只影响立即函数。如果您从递归函数 returning 并且所有父调用也结束,那么不是 return 导致的,而是每个父调用中的终止条件也必须变为真。

也就是说:您的函数正在终止,因为它们都在测试并且都满足相同的条件。

以下是函数继续的例子:

#include <iostream>

std::string padding = "     ";
void f(int i, int d) {
    if (d == 4) // only go 4 deep
        return;
    std::string pfx = padding.substr(0, d);
    for (int i = 0; i < 5; ++i) {
        std::cout << pfx << "i:" << i << ", d:" << d << "\n";
        f(0, d + 1);
    }
}

int main() {
    f(0, 0);
}

现场演示:http://ideone.com/9ePJEE

我的提早出局只适用于特定深度,所以尽管我测试的是一个常数,但我测试的是一个变量。然而,即使在我第一次到达深度 4 之后,递归仍在继续。return 不会终止递归或父级,只会终止直接函数调用。

您提供的示例函数测试 j == N 其中 N 是一个外部值,因此在您的递归框架内基本不变;当一个函数看到它有效地达到 N 时,所有函数都会有效地达到,因此当最低函数看到 N 时,您的整个循环就会展开。

--- 编辑 ---

您的最新示例在修复为实际编译时由于循环约束而中止。同样,return 不是问题,您只有一个最大值 (N),您的循环 all 同时工作。

http://ideone.com/SmKAuC

| | for (i = 3; i < 3)
| | reached 'N' at this level, returning
| reached 'N' at this level, returning
loop iter with i = 2
| j:2, N:3
| for (i = 3; i < 3)
| reached 'N' at this level, returning

在您的示例代码的这个版本中,我们从未达到显式 return 我们只是 运行 失去了功能,即便如此,我们还是用 i = 2 进行了迭代,所以return 不会终止整个帧。