0

我需要一些帮助。我有一个递归函数,在 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 中。任何帮助将不胜感激。

谢谢。

4

2 回答 2

2

条件内的语句不应该是:

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

否则,你只是在打电话

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

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

于 2012-04-23T20:28:49.477 回答
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;
}
于 2012-04-24T07:35:39.290 回答