2015-06-02 62 views
-2

的最后一个电话我有一个函数调用递归:C++:仅停止递归函数

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

我的问题是,return将停止全递归(从第一个主叫方节点),但我会像它只停止最后一个节点。这怎么可能?

编辑:看来,我的问题是不是可以理解为大家,让我们重新整理措辞:(不注意的代码,它仅仅是一个递归函数的例子)

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

+1

N从哪里来? –

+0

*您可以控制递归何时停止,因此请调整您的终止条件! – crashmstr

+0

你能否详细说明'会停止完整的递归吗?这没有意义:回报实际上不会突破所有其他功能。递归可以在调用函数体中继续。 – BeyelerStudios

回答

0

return只影响即时功能。如果从递归函数中获得return并且所有父调用也结束,那么它不是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),你的循环是所有同时工作。

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,所以这回不会终止整个框架。

0

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

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

'j'是一个'int'。你不能做'j-> next'。 – lurker

+0

他的代码真的没有什么意义。当他说节点时,我认为节点意味着某种节点列表中的节点。 –

+1

我同意它没有意义。直到确实有道理,它才会被回答。 – lurker

0

你可能不想在这样的循环中调用你的递归函数;更可能的是,你想要做的事与j + 1

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

现在,调用myFunction(0, 10)将打印数字0通过9升序排列。