这是一个非常愚蠢的问题,但我需要一点保证/帮助。我有当前的“递归”情况:
void add( int value )
{
// do something ... //
if ( condition ) {
add(myVal);
acc = 0;
}
}
我的问题是变量acc
最终是否会设置为零。它应该,对吗?即使第二次(在递归时)条件不成立也是如此。它将完成执行该功能并继续将acc
设置为0 ..我想/希望?
谢谢!
编辑:我没有发布完整的代码,因为我认为没有必要。这有点冗长。值得一提的是condition
并非总是如此。因此,这种递归不是无限的。
编辑2:最大递归是2.也就是说,如果条件第一次成立,它将在第二次(递归时)结果为假,避免无限循环。澄清我的问题:考虑条件首先结果为真的情况,因此递归发生。函数完成后(在递归期间结果将为false)并退出,它将退出到原始函数,并且也将退出。退出后,它会在中断的地方继续,即设置acc = 0然后返回吗?下面的答案之一为此提供了一个很好的解释。
答案 0 :(得分:4)
假设对add
的递归调用返回,是的,在第一个位置进行递归调用的函数内的acc
的值确实将被设置为零。你可以认为代码是这样的:
if ( condition ) {
make a call to add(myVal);
wait for that call to return;
acc = 0;
}
一个重要的细节是,假设acc
是函数中的局部变量,它只会在调用函数中设置为零,而不是递归调用你做了例如,如果您的代码如下所示:
void add( int value )
{
int acc = 1;
cout << acc << endl;
if ( condition ) {
add(myVal);
acc = 0;
}
}
然后,如果您确实进行了指示的递归调用,递归调用中cout
语句的输出仍为1
,因为此特定递归中acc
的值call在其他递归调用中独立于acc
的值。
希望这有帮助!
答案 1 :(得分:2)
如果条件从一开始就为假,则acc不会设置为零。否则,是的。
因此,唯一影响acc get是否设置为零的因素是条件值第一次。
答案 2 :(得分:0)
是的,函数在调用它们之后立即返回,因此acc
将设置为0.
请注意,如果它是全局的,当你从递归返回时,它将被反复设置为0,而如果它是本地的,那么这是函数的结束,它可能没有做任何有用的事情(阅读,它会被编译器优化出来。)
答案 3 :(得分:-2)
正如其他人所说,如果acc是本地的,那么什么都不做,如果acc不是本地的,这是多余的。此外,如果第一次调用条件为假,则无法保证acc将被设置为零。你可能想要这个:
void add( int value )
{
// do something ... //
if ( condition ) {
add(myVal); //if condition is true, recurse.
} else {
acc = 0; //else, set acc to zero once and escape all the recursion
}
}
退出后,是否会继续停止,即设置acc = 0然后返回?
是