Нам была дана простая задача - найти наиболее эффективный способ суммирования всех чисел между начальной и конечной точкой (от «и» до «)» с использованием рекурсии и итерации соответственно без использования очевидной формулы, которая будет O (1).Sum (i ... j) - есть ли более эффективное/элегантное решение для этого?
Там нет приложения для этого, я просто любопытно, и вызов, чтобы увидеть, если мое решение может быть улучшено/полированная больше, чем уже есть:
/* recursion */
unsigned int sum1(unsigned int from, unsigned int to) {
if (to - from < 2)
return from + (from == to ? 0 : to);
else
return from + to + sum1(from + 1, to - 1);
}
/* iteration */
unsigned int sum2(unsigned int from, unsigned int to) {
int p = to - from;
if (p == 0) return from;
int i, s, n = p/2;
if (p % 2 == 0) s = n + from;
else {
s = 0;
n++;
}
for (i = 0; i < n; i++) {
s += from++ + to--;
}
return s;
}
возможно дубликат [быстрый из возможных чисел суммируя до N] (http://stackoverflow.com/questions/2624387/fastest-possible-summing-numbers-up-to-n) –
Как это глупое задание! Как «Сделать бутерброд, но вы не можете использовать нож, только меч, и вырастите свою собственную корову, и используйте свое молоко, чтобы налить масло на хлеб» ... –
Углекислота, почему ненавидят, пытаясь получить класс, чтобы думать, как вы думаете, какие из других полезных алгоритмов потребуют? Это просто упражнение, чтобы практиковать концепцию. – rtheunissen