C++中递归函数的返回

C++中递归函数的返回,c++,recursion,C++,Recursion,我有点困惑。让我们看看下面的代码: bool testing(int i) { if((i%2)==0) { return true; } else { --i; testing(i); } return false; } 当我测试5时,我希望函数返回true,因为在某个时刻,5将变成4,因此4%2==0,所以函数将返回true,但事实并非如此。怎么了?你应该返回testingi;而不仅仅是测试我 您应该返回te

我有点困惑。让我们看看下面的代码:

bool testing(int i) {

    if((i%2)==0) {
        return true;
    } else {
        --i;
        testing(i);
    }
    return false;
}
当我测试5时,我希望函数返回true,因为在某个时刻,5将变成4,因此4%2==0,所以函数将返回true,但事实并非如此。怎么了?

你应该返回testingi;而不仅仅是测试我

您应该返回testingi;而不仅仅是测试我

因为您只调用testingi函数。这就是为什么它不是递归调用

您应该编写return testingi,因为您只调用testingi函数。这就是为什么它不是递归调用


您应该编写返回测试i

您不能冒泡出最终返回值;您需要在递归调用中使用return。此外,您还可以简化预减量:


返回测试-i

您不会冒泡出最终返回值;您需要在递归调用中使用return。此外,您还可以简化预减量:

返回测试-i

递归的概念是当函数直接或间接地调用自身时。 如果将代码中的函数修改为:

bool testing(int i){
    // test if even, if so return true
    if((i % 2) == 0){
        return true;
    // otherwise decrement and test again
    }else{
        // at this point the function calls itself with decremented argument
        return testing(--i);
    }
    // I doubt that this case will be ever returned  
    // more likely your function will return "true" or run "forever" decrementing
    return false;
}
为了避免无限循环,您需要一个基本情况,即产生无递归结果的终止条件。例如,如果我变得非常小或为负值,则返回false

让它更简洁一点,您最终有三个案例:

bool testing(int i){
    // base case
    if(i < 0) return false;
    // test if even
    if((i % 2) == 0) return true;
    // recursion step
    return testing(--i);
}
进一步阅读,请查看递归的概念是当函数直接或间接调用自身时。 如果将代码中的函数修改为:

bool testing(int i){
    // test if even, if so return true
    if((i % 2) == 0){
        return true;
    // otherwise decrement and test again
    }else{
        // at this point the function calls itself with decremented argument
        return testing(--i);
    }
    // I doubt that this case will be ever returned  
    // more likely your function will return "true" or run "forever" decrementing
    return false;
}
为了避免无限循环,您需要一个基本情况,即产生无递归结果的终止条件。例如,如果我变得非常小或为负值,则返回false

让它更简洁一点,您最终有三个案例:

bool testing(int i){
    // base case
    if(i < 0) return false;
    // test if even
    if((i % 2) == 0) return true;
    // recursion step
    return testing(--i);
}

要进一步阅读,请选中它返回false,因为它的返回值被return false的最后一条语句覆盖

它返回false,因为它的返回值被return false的最后一条语句覆盖

你在调试器中单步执行了吗?然后你可以看到发生了什么我想你应该回去做测试。它调用测试的方式,但它继续执行并返回false。作为优化说明,最好使用ifi&1==0,而不是ifi%2==0。同样,最好使用返回测试i-1而不是-i;返回restingi,尽管优化器无论如何都会优化它。@iadct。谢谢您的建议。@iAdjunct i&1和i%2对于负数不是等价的。您是否在调试器中进行了单步调试?然后你可以看到发生了什么我想你应该回去做测试。它调用测试的方式,但它继续执行并返回false。作为优化说明,最好使用ifi&1==0,而不是ifi%2==0。同样,最好使用返回测试i-1而不是-i;返回restingi,尽管优化器无论如何都会优化它。@iadct。谢谢您的建议。@iAdjunct i&1和i%2对于负数不是等价的。是的,它是不可访问的。这是另一个问题。是的,这是不可能实现的。这是一个单独的问题。优化的意思是去掉花括号?您也不需要最后一个else。@Emz您是对的,代码编写得更清晰简洁,没有经过优化,而else确实是不需要的。谢谢:我建议大家阅读一下这个问题。@Emz个人意见大括号可以省略,如果有一条语句可以放在流控制语句之后的同一行中。书中有一些例子省略了大括号,并在下一行python样式中使用了缩进,但这确实是不明确的。如果有较大的代码块,则应将其括起来。优化的意思是删除花括号?您也不需要最后一个else。@Emz您是对的,代码编写得更清晰简洁,没有经过优化,而else确实是不需要的。谢谢:我建议大家阅读一下这个问题。@Emz个人意见大括号可以省略,如果有一条语句可以放在流控制语句之后的同一行中。书中有一些例子省略了大括号,并在下一行python样式中使用了缩进,但这确实是不明确的。如果有较大的代码块,则应将其封闭。