【问题标题】:c++ recursive function wont exit when condition is meet满足条件时c ++递归函数不会退出
【发布时间】:2012-05-04 11:40:47
【问题描述】:

我需要一些帮助。我有一个递归函数,在 c++ 中,它只是分解一个字符串(所有数字)并将字符相加,看看它的总数是否小于 9。如果不是,它会再次调用自己,直到满足条件。到目前为止,它一直在工作,直到满足我的条件时它再次调用该函数。这显然会弄乱我试图分配给它的变量的值。我参考了很多参考资料,看来我的语法是正确的?关于为什么我的函数最后一次调用它的任何帮助。

/////////////////////////////////////// //////////

int finalNumber =0;

// set finalNumber

finalNumber = sumTotal(sumInput);

int sumTotal(int sumInputToString)
{

    stringstream strToInt;
    string convertedInt;

    strToInt << sumInputToString;
    convertedInt= strToInt.str();

    int sum = 0;

    for(int i = 0; i < convertedInt.length(); i++)
    {
        sum += (int)convertedInt[i] - 48;
    }

    if (sum > 9)
    {
        sumTotal(sum);
    }
    return sum; //ONCE SUM IS LESS THAN 9,which is what i want, 
                //MY PROGRAM AUTOMATICALLY JUMPS UP TWO LINES does it one 
                //more time than it will escape.
}

我已经尝试了一切,从将我的回报放入 else{} 并交换我的 if else 条件,以便我的回报将在我的 if 中。任何帮助将不胜感激。

谢谢。

【问题讨论】:

  • 作为@ahenderson - 这使得整个事情处于失控模式。顺便说一句 - 尽量避免回避。通常以泪水告终
  • 您是说程序以错误的值终止还是卡住了?因为如果值小于 10,那么再调用一次应该不会改变结果。

标签: c++ recursion return


【解决方案1】:

基于此评论

我的程序会自动跳两行

我可能建议您在调试器中查看此内容。向上跳两行本身是正确的——你在函数堆栈上向上移动(即返回到调用你的函数——它又是sumTotal)。那么你确定一切都完成后功能真的从头开始吗?

还要考虑一件事:如果 sumInputToString 的初始值小于 10,那么无论如何您的代码都会被执行。你真的想要吗?

几乎没有与您的问题直接相关的建议。很难理解你的函数真正应该做什么。对于任何复杂的算法(这可能被认为是复杂的,因为你使用了resursion)你必须有一个好的函数注释。我会建议这样的事情:

此函数首先计算给定中所有数字的总和 数字。如果结果小于或等于 9,则返回。如果不, 我们继续将此总和作为给定数字。

你也可以包括短句为什么你需要它(因为乍一看可能看起来很奇怪):

这个函数可以用来判断某个数是否能被3整除。

在写完这样的评论后,您开始了解逻辑应该是什么,并且可能意识到您不需要在这里进行递归。并将你的代码转换成这样的:

// Function comment
int CalculateRecursiveSumOfDigits(int val) {
    while (val > 9) {
        val = CalculateSumOfDigits(val); // TODO: implement this function
    }

    return val;
}

【讨论】:

    【解决方案2】:

    条件里面的语句不应该是:

    if (sum > 9)
    {
        sum = sumTotal(sum);
    }
    

    否则,你只是在打电话

    if (sum > 9)
    {
        sumTotal(sum);
    }
    return sum;
    

    什么都不做(即对最终输出没有贡献)。

    【讨论】:

    • 这会影响终止吗?
    • @ZiyaoWei 会影响返回号码。
    • 是的,我知道:) 只是多了一个错误。编辑:我刚刚注意到 OP 没有提到终止。
    • 我通常更喜欢函数顶部的if (sum &lt;= 9) return sum;,最后是简单的return sumTotal(sum);。当终止条件放在顶部时,递归更容易掌握。
    猜你喜欢
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    相关资源
    最近更新 更多