2015-09-19 5 views
3

Я пытаюсь суммировать целые числа, но я не знаю, где ошибка в этом коде просто скажите мне, где ошибка в этом коде, не дают другие пути решения этого вопросаОшибка рекурсии - где этот код идет не так?

В выход должен быть 6, но код дает 4.

int SUM(int n) { 
    cout<<n<<endl; 

    if(n!=1) 
    return n + SUM(--n); 

    return n; 
} 
int main() { 

    cout<<SUM(3)<<endl; 

} 
+1

'возвращение п + SUM (- п);' очень подозрительно, так как вы ссылки п, но мутирует его где-нибудь еще в том же выражении. Вероятно, это отличается от того, что вы ожидаете. – user1937198

+2

Почему декремент вместо того, чтобы просто передавать «n-1» в качестве аргумента? У вас есть порядок оценки проблемы, как написано - неопределенно, как вещи вычисляются, но декремент, вероятно, происходит до того, как 'n' на LHS добавления будет оценен, что приведет к результату, который вы видите. –

+0

, но поиск факториала одинаково работает отлично, –

ответ

4
return n + SUM(--n); 

Я считаю, что изъян в строке выше. Сокращение n, вероятно, не то, что вы хотели сделать; более вероятно, что вы хотели сделать это:

return n + SUM(n-1); 
+1

Чтобы уточнить, компилятор не гарантирует, что операция '-n' произойдет * после операции' n + SUM (...) '. Таким образом, такое простое выражение приводит к неопределенному поведению. Если n = 3 до этой строки, вы можете возвращать '3 + SUM (2)' ** или ** '2 + SUM (2)'. – Ephemera

+1

Одним из интересных фактоидов является то, что после аргументов функции и определения функции была указана точка последовательности (и еще до того, как функция вернулась), и очень часто имеет точку последовательности вокруг исправлений неопределенного поведения. Однако в этом случае он не гарантирует, оценивается ли LHS или RHS выражения в первую очередь, и если (как представляется, это так) сначала оценивается RHS, тогда 'n' уменьшается до оценки LHS , (См. Также [В C99, 'f() + g()' undefined или просто не указано?] (Http://stackoverflow.com/questions/3951017)) –

Смежные вопросы