Рекурсивно добавить последовательность чисел - PullRequest
6 голосов
/ 09 мая 2011

Эй, я пытаюсь освежить свой разум с помощью небольшой рекурсии. Я хочу добавить все числа от начала до конца включительно.

Т.е. если бы начало было 1, а конец был 5. Тогда ответ был бы 1 + 2 + 3 + 4 + 5 = 15

Пока у меня есть это

int calc(int start, int end){
    if(start > end)
        return total;
    else{
        total = total + start;  
    return sum1(start++, end);
    }
} 

Это не работает (я получаю ошибку сегмента). Что я делаю не так?

РЕДАКТИРОВАТЬ: Извините, я использую те же переменные в моем реальном коде, когда я написал это, я закончил ссылаться на них как начало / конец и забыл изменить весь код.

Ответы [ 4 ]

7 голосов
/ 09 мая 2011

Что такое переменные from и to внутри вашей функции? Может быть, вы используете некоторые глобальные переменные вместо start и end, и поэтому у вас проблема? Кроме того, почему вы используете sum1 внутри функции calc вместо calc?

Попробуйте вместо этого:

int calc(int start, int end){
    if(start > end)
        return 0;
    else
        return start + calc(start + 1, end);
} 
3 голосов
/ 09 мая 2011

Кстати, вот более эффективное решение:

int calc(int from, int to)
{
    if (from == 0)
        return to * (to+1) / 2;
    else
        return calc(0, to) - calc(0, from);
}

Это даже рекурсивно!Ну, пока вы не упростите это до

int calc(int from, int to)
{
    return ( to * (to+1) - from * (from+1) ) / 2;
}

Это потому, что f (n) = n + ... + 3 + 2 + 1 = n (n + 1) / 2

3 голосов
/ 09 мая 2011

Для начала, вы не используете параметры вашей функции (начало, конец), а вместо этого (от, до). Я предполагаю, что from и to являются либо глобальными переменными, либо ваш код не будет компилироваться. Кроме того, где заявлено общее количество?

Это должно работать лучше:

int calc(int start, int end){
    if(start > end)
        return 0;
    else{
        return start + calc(start+1, end);
    }
} 
0 голосов
/ 09 мая 2011

Это прекрасно работает для.

int calc(int from, int to)
{
    if (from >= to) return to;
    return from + calc(from + 1, to); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...