update
This commit is contained in:
parent
962caebbb7
commit
87bf53d076
1825 changed files with 94929 additions and 0 deletions
45
1-js/2-first-steps/19-recursion/1-sum-to/solution.md
Normal file
45
1-js/2-first-steps/19-recursion/1-sum-to/solution.md
Normal file
|
@ -0,0 +1,45 @@
|
|||
Решение **с использованием цикла**:
|
||||
|
||||
```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)` выдаст ошибку.
|
33
1-js/2-first-steps/19-recursion/1-sum-to/task.md
Normal file
33
1-js/2-first-steps/19-recursion/1-sum-to/task.md
Normal file
|
@ -0,0 +1,33 @@
|
|||
# Вычислить сумму чисел до данного
|
||||
|
||||
[importance 5]
|
||||
|
||||
Напишите функцию `sumTo(n)`, которая для данного `n` вычисляет сумму чисел от 1 до `n`, например:
|
||||
|
||||
```js
|
||||
sumTo(1) = 1
|
||||
sumTo(2) = 2 + 1 = 3
|
||||
sumTo(3) = 3 + 2 + 1 = 6
|
||||
sumTo(4) = 4 + 3 + 2 + 1 = 10
|
||||
...
|
||||
sumTo(100) = 100 + 99 + ... + 2 + 1 = 5050
|
||||
```
|
||||
|
||||
Сделайте три варианта решения:
|
||||
<ol>
|
||||
<li>С использованием цикла.</li>
|
||||
<li>Через рекурсию, т.к. `sumTo(n) = n + sumTo(n-1)` для `n > 1`.</li>
|
||||
<li>С использованием формулы для суммы [арифметической прогрессии](http://ru.wikipedia.org/wiki/%D0%90%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F).</li>
|
||||
</ol>
|
||||
|
||||
Пример работы вашей функции:
|
||||
|
||||
```js
|
||||
function sumTo(n) { /*... ваш код ... */ }
|
||||
|
||||
alert( sumTo(100) ); // 5050
|
||||
```
|
||||
|
||||
**Какой вариант решения самый быстрый? Самый медленный? Почему?**
|
||||
|
||||
**Можно ли при помощи рекурсии посчитать `sumTo(100000)`? Если нет, то почему?**
|
Loading…
Add table
Add a link
Reference in a new issue