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

时间:2015-06-02 15:48:40

标签: c++ recursion return

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

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

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

编辑:似乎我的问题对每个人都不可理解,让我们改一下:(不要注意代码,它只是一个递归函数的例子)

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

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

你可能不想在这样的循环中调用你的递归函数;更有可能的是,您希望使用void myFunction(int j, int N) { if (j == N) { return; } std::cout << j << std::endl; myFunction(j + 1, N); } 执行某些操作:

myFunction(0, 10)

现在,拨打0会按升序排列9到{{1}}的数字。

答案 2 :(得分:0)

return仅影响即时功能。如果您return来自递归函数并且所有父调用也结束,那么它不会导致return,但每个父调用中的终端条件也必须变为真。< / p>

那就是:你的功能正在终止,因为它们都在测试并且都满足相同的条件。

以下是功能继续的示例:

#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进行迭代,所以这个返回不会终止整个框架。