2012-04-23 138 views
0

我需要一些帮助。我有一个递归函数,在C++中,简单地分裂开的字符串(所有数字),并增加了人物,看看它的总量小于9,如果不是再次调用自身直到条件满足。到目前为止,它的一切工作,直到结束的时候我的条件是满足它调用该函数一次。这显然混淆了我试图分配给它的变量的值。我提到了很多参考文献,看起来我的语法是正确的?任何帮助为什么我的函数最后一次调用自己的函数。C++递归函数不会退出时的条件是满足

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

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. 
} 

我从把我的回报在其他{}和交换我的,如果其他条件,所以我的回报将是我的,如果什么都试过了。任何帮助将不胜感激。

谢谢。

+0

作为@ahenderson - 使整个事情处于逃跑模式。顺便说一句 - 尽量避免recusion。通常以泪水结束 – 2012-04-23 20:32:57

+0

你是说这个程序的终止与错误的价值或只是坚持?因为如果该值小于10,则再次调用它不应改变结果。 – 2012-04-23 20:33:30

回答

2

不应该的条件里面的说法是:

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

否则,你只是打电话

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

它什么也不做(即无助于最终输出)。

+0

这会影响终止吗? – 2012-04-23 20:29:42

+0

@ZiyaoWei它会影响返回的号码。 – 2012-04-23 20:30:16

+0

是的,我知道:)只是一个错误。编辑:我只注意到OP没有提到有关终止。 – 2012-04-23 20:30:43

1

基于此评论

我的程序会自动跳到两个系

我建议你在调试器中看到这一点。跳起来2线本身是正确的 - 你的函数栈上移(即返回调用你的功能 - 这又是sumTotal)。那么你确定在做完所有事情之后,功能真的从一开始就开始了吗?

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

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

这个函数首先计算在给定 号码的所有数字之和。如果结果小于或等于9,则返回。如果没有, 继续这个和作为给定数。

您也可以包括短sentense你为什么需要它(因为它可能乍一看似乎很奇怪):

此功能可用于找出一些号码是否是被3整除或不。

在阅读完这样的评论后,你开始明白逻辑应该是什么,并可能意识到你不需要递归。并将您的代码转换为如下形式:

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

    return val; 
}