简单的递归问题

时间:2010-08-03 17:14:42

标签: c++ recursion

假设我们有一个简单的递归,如。

int x(int a){
   if(a<10)
     x(a+1);
    else
      !STOP!
    b++;
return b;
}

Globaly:

int b=0;

主要是我们可以这样:

  int p=x(1);

有没有办法停止递归,以便p为0,这意味着永远不会执行“b ++”。

如果你能告诉我一些表达而不是!停止,我将不胜感激!

但是,我不想要这样的东西,我只想停止递归,就像休息一样;在while()循环中执行...:

int ok=0;
  int x(int a){
       if(a<10)
         x(a+1);
        else
          ok=1;
      if(ok==0)
        b++;
    return b;
    }

如果对此问题有任何疑问,请询问。

6 个答案:

答案 0 :(得分:7)

你为什么不这样做?

int x(int a){
   if(a<10) {
      x(a+1);
      b++;
   }
   return b;
}

但事实是,你在一个递归例程中修改了一个全局,这不是特别线程安全且非常草率。除了顶级调用者之外,您将返回一个始终被忽略的值。你也做了一些比循环更好的事情(但我认为你的实际情况比这更大,或者你是学生)。

你无法真正“打破”递归 - 回归顺利。在oldey-timey C中你可能会使用setjmp / longjmp(以及它的所有危险 - 换句话说,DO NOT),而在C ++中你可能会使用try / catch / throw,这也将展开堆栈。

答案 1 :(得分:1)

这样怎么样?

int x(int a){
   if(a>0 && a<10)
     x(a+1);
   b++;
   return b;
}

答案 2 :(得分:1)

回来怎么样?

int x(int a){
   if(a<10)
     x(a+1);
    else
      return b;
    b++;
return b;
}

我认为这看起来好一点

int x(int a){
   if(a<10)
     x(a+1);
    else
      return b;

    return ++b;
}

修改

我认为您可以使用异常机制来展开堆栈并进入第一次调用,但在输入main()后它是安全的。在b中引用x,给出代码:

int b = 0;
int p = x(1);

建议x用于初始化某个全局变量,并且可以在main()之前执行。如何在try-catch块中使用包含x调用的辅助函数并在| STOP |?中放置异常?

答案 3 :(得分:1)

C ++中唯一能够像这样展开堆栈的东西是一个例外。还有setjmp()/longjmp(),但这些不应该在C ++程序中使用。任何其他构造最多可以从当前函数返回。

答案 4 :(得分:0)

如果您尝试在b中声明main(),并在b中使用x(),那么就已经出现了问题。相反,通过将b作为参数传递给x并返回b的修改版本,将int x(int a, int b){ if(a<10) return x(a+1,b+1); else return b; } 变为局部变量。

{{1}}

答案 5 :(得分:0)

我不是使用Exception进行控制的忠实粉丝。我不希望你通过使用Exceptions而不是if / return语句来节省很多周期。在抛出异常之前,你将不得不测试你的边界条件。

但是,您可以通过更改函数的返回类型来简化问题。

bool x(int a){
  if(ok) //Exit early before next call up?
    return true;  
  if(a<10){
    if(x(a+1))  //Have we been told to exit early?
      return true; //Yes
    b++; //Do some work
    if(ok) //Exit early in the next call down?
      return true;  
  }
  return false; //Normal Exit
}