假设我们有一个简单的递归,如。
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;
}
如果对此问题有任何疑问,请询问。
答案 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
}