C++ 简单递归问题

C++ 简单递归问题,c++,recursion,C++,Recursion,假设我们有一个简单的递归,比如 int x(int a){ if(a<10) x(a+1); else !STOP! b++; return b; } 大体上我们可以有这样的东西: int p=x(1); 有没有办法停止递归,使p为0,这意味着永远不会执行“b++” 若你们能告诉我一些解释来代替这个,我将不胜感激!住手 但是,我不想要这样的东西,我只想停止递归,比如break;是否在while()循环中…: intok=0; 整数x(整数

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

int x(int a){
   if(a<10)
     x(a+1);
    else
      !STOP!
    b++;
return b;
}
大体上我们可以有这样的东西:

  int p=x(1);
有没有办法停止递归,使p为0,这意味着永远不会执行“b++”

若你们能告诉我一些解释来代替这个,我将不胜感激!住手

但是,我不想要这样的东西,我只想停止递归,比如break;是否在while()循环中…:

intok=0;
整数x(整数a){
如果(a这样怎么样

int x(int a){
   if(a>0 && a<10)
     x(a+1);
   b++;
   return b;
}
intx(inta){
如果(a>0&&a像这样怎么样

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

如果(a>0&&a为什么不这样做

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

如果(a你为什么不这样做

int x(int a){
   if(a<10) {
      x(a+1);
      b++;
   }
   return b;
}
intx(inta){
如果(a返回如何

int x(int a){
   if(a<10)
     x(a+1);
    else
      return b;
    b++;
return b;
}
建议将
x
用于初始化某些全局变量,并且可以在
main()
之前执行。使用一些辅助函数,将
x
的调用封装在try-catch块中,并在| STOP |?

返回如何

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

建议将
x
用于初始化某些全局变量,并可在
main()之前执行如何使用一些帮助函数来封装在一个Test-catch块中调用<代码> x <代码>,并在“停止”的位置抛出一个异常:

< p>。C++中唯一能解开栈的东西是一个例外。还有“代码> SETJMP()/LangJMP()。,但是这些代码不应该在C++程序中使用。任何其他的构造都可以从当前函数中最多返回。

< P>,C++中唯一的一个将解压缩栈的方法就是异常。< /代码>,但这些代码不应该在C++程序中使用。任何其他的构造都可以从当前函数中最多返回。

< p>如果您试图在<代码>主()/<代码>中声明<代码> b>代码>,在<代码> x()中使用<代码> b>代码>
那么开始就有问题了。相反,通过将
b
作为参数传递给
x
,并返回
b
的修改版本,将其转换为局部变量

int x(int a, int b){
   if(a<10)
      return x(a+1,b+1);
    else
      return b;
}
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
}
intx(inta,intb){

如果(a如果您试图在
main()
中声明
b
,并在
x()
中使用
b
,那么一开始就有问题。相反,通过将
b
作为参数传递给
x
,并返回
b
的修改版本,将其转换为局部变量

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

if(a我不太喜欢使用异常进行控制。我不希望通过使用异常而不是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
}
boolx(inta){
if(ok)//在下次调用之前提前退出?
返回true;

if(a我不太喜欢使用异常进行控制。我不希望通过使用异常而不是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
}
boolx(inta){
if(ok)//在下次调用之前提前退出?
返回true;


如果(哦,当我指的是停止递归时,我也指的是自动删除堆栈…Cristy,你可以编辑你的问题,而不是在其中添加注释。你为什么要这样做?看起来你可能在工作中使用了错误的工具,但如果没有具体的例子说明你打算做什么,就很难说。你的问题是关于一般问题?比如,我应该用什么来代替!停止!?@Cristy-这里有一个小提示:在代码中把停止的大小写放在递归的大小写之前。这可能会让事情更清楚。大多数介绍书都是这样教递归的。哦,当我指停止递归时,我也指自动删除堆栈…Cristy,你可以编辑你的问题ra而不是添加注释。你为什么要这样做?看起来你可能在工作中使用了错误的工具,但是如果没有具体的例子,很难判断你打算做什么。你的问题是关于一般性问题吗?例如,我应该用什么来代替!停止!?@Cristy-这里有一个快速提示:将停止案例放在递归之前在你的代码中有一个很好的例子。这可能会让事情更清楚。大多数介绍书都是这样教递归的。如果我把函数称为x(1),这段代码只会执行b++;一次。因为1@Jerry很抱歉,关于这一点,修复了我的输入错误。如果我调用函数x(1),这段代码将只执行b++;1次因为1@Jerry抱歉,关于这件事,修正了我的打字错误。谢谢你的answear!所以我的想法是我不能“打破”一个递归…无论如何,这样做的想法是阻止程序进行无用的计算…我的意思是,我可以有一个递归,需要一直向前,然后,当返回到停止递归的一半时,没有“递归”通过剩下的一半。我不能解释得太好,但我希望你明白我的意思:DAs plinth说,在这种情况下,你可以抛出一个异常。我从未使用过throw&catch,在过去的两年中我已经编写了很多程序。我的意思是我真的应该读一下。)虽然你可以在这里使用异常,但你真的不应该。异常应该用于异常(即罕见的、意外的)情况。它们不应该用于流控制。我认为退出递归调用堆栈是异常的理想用途。感谢answear!所以我不能“中断”一个递归…无论如何,这样做的想法是阻止程序进行无用的计算…我的意思是,我可以有一个递归,需要一直向前走,然后,当返回到停止递归的一半时,没有“递归”通过剩下的一半。我不能