2012-04-23 5 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 - это делает все это в режиме ожидания. BTW - Старайтесь избегать рекуррентности. Обычно заканчивается в слезах –

+0

Вы говорите, что программа TERMINATES с неправильным значением или просто застряла? Поскольку, если значение меньше 10, то называть его еще раз не следует изменять результат. –

ответ

2

Не следует утверждение в состоянии быть:

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

В противном случае, вы просто вызов

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

, который ничего не делает (т.е. не участвует в конечной продукции).

+0

Это повлияет на окончание? –

+0

@ZiyaoWei это повлияет на возвращаемый номер. –

+0

Да, я знаю :) Еще одна ошибка. EDIT: Я только заметил, что OP ничего не сказал о прекращении. –

1

На основе этого комментария

МОЕЙ ПРОГРАММА АВТОМАТИЧЕСКИ подпрыгивает ДВА ЛИНИЙ

я могу предложить вам увидеть это в отладчике. Вскакивание вверх по двум линиям само по себе является правильным - вы поднимаетесь вверх по стеку функций (т.е. возвращаетесь к функции, которая называется ваша, и снова 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; 
} 
Смежные вопросы