42 lines
No EOL
1.4 KiB
Markdown
42 lines
No EOL
1.4 KiB
Markdown
Решение **с использованием цикла**:
|
||
|
||
```js run
|
||
function sumTo(n) {
|
||
var sum = 0;
|
||
for (var i = 1; i <= n; i++) {
|
||
sum += i;
|
||
}
|
||
return sum;
|
||
}
|
||
|
||
alert( sumTo(100) );
|
||
```
|
||
|
||
Решение через **рекурсию**:
|
||
|
||
```js run
|
||
function sumTo(n) {
|
||
if (n == 1) return 1;
|
||
return n + sumTo(n - 1);
|
||
}
|
||
|
||
alert( sumTo(100) );
|
||
```
|
||
|
||
Решение **по формуле**: `sumTo(n) = n*(n+1)/2`:
|
||
|
||
```js run
|
||
function sumTo(n) {
|
||
return n * (n + 1) / 2;
|
||
}
|
||
|
||
alert( sumTo(100) );
|
||
```
|
||
|
||
P.S. Надо ли говорить, что решение по формуле работает быстрее всех? Это очевидно. Оно использует всего три операции для любого `n`, а цикл и рекурсия требуют как минимум `n` операций сложения.
|
||
|
||
Вариант с циклом -- второй по скорости. Он быстрее рекурсии, так как операций сложения столько же, но нет дополнительных вычислительных затрат на организацию вложенных вызовов.
|
||
|
||
Рекурсия в данном случае работает медленнее всех.
|
||
|
||
P.P.S. Существует ограничение глубины вложенных вызовов, поэтому рекурсивный вызов `sumTo(100000)` выдаст ошибку. |