【问题标题】:c++ : stop only last call of recursive functionc ++:仅停止递归函数的最后一次调用
【发布时间】:2015-08-16 12:29:57
【问题描述】:

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

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

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

编辑:看来我的问题大家都看不懂,我们换个说法吧:(不要关注代码,只是递归函数的一个例子)

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

【问题讨论】:

  • N 来自哪里?
  • 控制递归何时停止,所以调整你的终止条件!
  • 你能详细说明will stop the full recursion吗?这没有任何意义:返回实际上不会突破您的所有其他功能。递归能够在调用函数体中继续。
  • 这个函数到底应该做什么?
  • 提供可复制的完整代码,但不提供“示例代码”。另外,目前还不清楚你想要什么。

标签: c++ recursion return


【解决方案1】:

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),您的循环所有都在同时工作。

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

【讨论】:

    【解决方案2】:

    您可能不想在这样的循环中调用递归函数;更有可能的是,您想对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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • j 是一个int。你不能这样做j-&gt;next
      • 他的代码写的没有意义,真的。当他说节点时,我认为节点意味着某种列表中的节点。
      • 我同意这没有意义。在有意义之前,它是不可回答的。
      猜你喜欢
      • 2016-03-05
      • 2014-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多