Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Реализовать cумму чисел в диапазоне от 10 до 25 че


Автор: sswt 12.10.2015, 13:09
Реализовать cумму чисел в диапазоне от 10 до 25 через рекурсию. Где я ошибку делаю?
Код

int ForFuncSum(int from, int to)
{
    if (from == to)
        return from;
    else
        to + ForFuncSum(from + 1, to);
}
int main()
{
    printf("%d\n",ForFuncSum(10, 25));
    return 0;
}


Автор: Guinness 12.10.2015, 13:29
Вы 16 раз просуммировали максимальное значение последовательности (25).

Добавлено @ 13:31
Собственно, тут два варианта:
Код

int ForFuncSum(int from, int to)
{
    if (from == to)
        return from;
    else
        return to + ForFuncSum(from, to - 1);
}

либо
Код

int ForFuncSum(int from, int to)
{
    if (from == to)
        return to;
    else
        return from + ForFuncSum(from + 1, to);
}

Автор: a0730 12.10.2015, 15:05
Вторая часть if не возвращает значение.
Код

#include <stdio.h>
int ForFuncSum(int from, int to)
{
    return (from == to)?from:from + ForFuncSum(from + 1, to);
}
int main()
{
    printf("%d\n",ForFuncSum(10, 25));
    return 0;
}



Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Realizovat-cummu-chisel-v-diapazone-ot-10-do-25-che-id561b8773ae201573138b4567#findElement_E7045_561ba1eeae20153524b12ed2_0

Автор: math64 12.10.2015, 15:58
Ну или так:
Код

int ForFuncSum(int from, int to)
{
    if (from == to)
        return from;
    if (from > to) {
        printf ("from=%d должен быть меньше или равен to=%d\n");
        return 0;
    }
    int mid = (from + to) /  2;
    return ForFuncSum(from, mid) + ForFuncSum(mid + 1, to);
}

В вариантах Guinness рекурсию можно заменить  на цикл, т.о. использование рекурсии не оправдано.
Но если считать сумму float, а не int, результат будет зависеть от порядка суммирования и вариант с делением диапазона пополам может выдать более точный результат.

Автор: Guinness 13.10.2015, 08:29
Цитата(math64 @  12.10.2015,  16:58 Найти цитируемый пост)
В вариантах Guinness рекурсию можно заменить  на цикл, т.о. использование рекурсии не оправдано.

Согласен. Но похоже человек проходит использование рекурсивного вызова функций. В своё время в институте нас заставляли вычисление факториала реализовывать через рекурсию, хотя вменяемый человек так делать в реальной жизни не будет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)