当条件满足时,c ++递归函数不会退出

时间:2012-04-23 20:23:29

标签: c++ recursion return

我需要一些帮助。我有一个递归函数,在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.
}

我已经尝试过将我的回报放入其他{}并交换我的if else条件所以我的回报将在我的if中。任何帮助将不胜感激。

感谢。

2 个答案:

答案 0 :(得分:2)

条件内的陈述不应该是:

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

否则,您只是致电

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

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

答案 1 :(得分:1)

基于此评论

  

我的节目自动弹出两条线

我建议你在调试器中看到这个。跳起2行本身是正确的 - 你向上移动函数堆栈(即返回到调用你的函数 - 它又是sumTotal)。那么你确定在完成所有工作后,功能真的从一开始就开始了吗?

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

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

  

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

你可能还包括短句,为什么你需要它(因为乍一看似乎很奇怪):

  

此功能可用于确定某个数字是否可以被3整除。

在评论这样的评论之后,你开始明白逻辑应该是什么,并且可能意识到你不需要在这里进行递归。并将您的代码转换为以下内容:

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

    return val;
}