From 6f2ab715f6a88358d18880949a023708847ac745 Mon Sep 17 00:00:00 2001 From: Alexandre888 Date: Wed, 5 Oct 2022 19:17:59 +0300 Subject: [PATCH] Revert "Some improvements" --- 1-js/05-data-types/07-map-set/article.md | 56 +++++++++---------- .../01-recursion/01-sum-to/solution.md | 3 +- .../01-recursion/article.md | 6 +- 3 files changed, 31 insertions(+), 34 deletions(-) diff --git a/1-js/05-data-types/07-map-set/article.md b/1-js/05-data-types/07-map-set/article.md index 67d51ff10b..e9403997ad 100644 --- a/1-js/05-data-types/07-map-set/article.md +++ b/1-js/05-data-types/07-map-set/article.md @@ -15,12 +15,12 @@ Методы и свойства: - `new Map()` -- создаёт коллекцию. -- [`map.set(key, value)`](mdn:js/Map/set) -- записывает по ключу `key` значение `value`. -- [`map.get(key)`](mdn:js/Map/get) -- возвращает значение по ключу или `undefined`, если ключ `key` отсутствует. -- [`map.has(key)`](mdn:js/Map/has) -- возвращает `true`, если ключ `key` присутствует в коллекции, иначе `false`. -- [`map.delete(key)`](mdn:js/Map/delete) -- удаляет элемент по ключу `key`. -- [`map.clear()`](mdn:js/Map/clear) -- очищает коллекцию от всех элементов. -- [`map.size`](mdn:js/Map/size) -- возвращает текущее количество элементов. +- `map.set(key, value)` -- записывает по ключу `key` значение `value`. +- `map.get(key)` -- возвращает значение по ключу или `undefined`, если ключ `key` отсутствует. +- `map.has(key)` -- возвращает `true`, если ключ `key` присутствует в коллекции, иначе `false`. +- `map.delete(key)` -- удаляет элемент по ключу `key`. +- `map.clear()` -- очищает коллекцию от всех элементов. +- `map.size` -- возвращает текущее количество элементов. Например: @@ -104,9 +104,9 @@ map.set("1", "str1") Для перебора коллекции `Map` есть 3 метода: -- [`map.keys()`](mdn:js/Map/keys) -- возвращает итерируемый объект по ключам, -- [`map.values()`](mdn:js/Map/values) -- возвращает итерируемый объект по значениям, -- [`map.entries()`](mdn:js/Map/entries) -- возвращает итерируемый объект по парам вида `[ключ, значение]`, этот вариант используется по умолчанию в `for..of`. +- `map.keys()` -- возвращает итерируемый объект по ключам, +- `map.values()` -- возвращает итерируемый объект по значениям, +- `map.entries()` -- возвращает итерируемый объект по парам вида `[ключ, значение]`, этот вариант используется по умолчанию в `for..of`. Например: @@ -237,11 +237,11 @@ let obj = Object.fromEntries(map); // убрать .entries() Его основные методы это: - `new Set(iterable)` -- создаёт `Set`, и если в качестве аргумента был предоставлен итерируемый объект (обычно это массив), то копирует его значения в новый `Set`. -- [`set.add(value)`](mdn:js/Set/add) -- добавляет значение (если оно уже есть, то ничего не делает), возвращает тот же объект `set`. -- [`set.delete(value)`](mdn:js/Set/delete) -- удаляет значение, возвращает `true`, если `value` было в множестве на момент вызова, иначе `false`. -- [`set.has(value)`](mdn:js/Set/has) -- возвращает `true`, если значение присутствует в множестве, иначе `false`. -- [`set.clear()`](mdn:js/Set/clear) -- удаляет все имеющиеся значения. -- [`set.size`](mdn:js/Set/size) -- возвращает количество элементов в множестве. +- `set.add(value)` -- добавляет значение (если оно уже есть, то ничего не делает), возвращает тот же объект `set`. +- `set.delete(value)` -- удаляет значение, возвращает `true`, если `value` было в множестве на момент вызова, иначе `false`. +- `set.has(value)` -- возвращает `true`, если значение присутствует в множестве, иначе `false`. +- `set.clear()` -- удаляет все имеющиеся значения. +- `set.size` -- возвращает количество элементов в множестве. Основная "изюминка" - это то, что при повторных вызовах `set.add()` с одним и тем же значением ничего не происходит, за счёт этого как раз и получается, что каждое значение появляется один раз. @@ -294,9 +294,9 @@ set.forEach((value, valueAgain, set) => { `Set` имеет те же встроенные методы, что и `Map`: -- [`set.keys()`](mdn:js/Set/keys) -- возвращает перебираемый объект для значений, -- [`set.values()`](mdn:js/Set/values) -- то же самое, что и `set.keys()`, присутствует для обратной совместимости с `Map`, -- [`set.entries()`](mdn:js/Set/entries) -- возвращает перебираемый объект для пар вида `[значение, значение]`, присутствует для обратной совместимости с `Map`. +- `set.values()` -- возвращает перебираемый объект для значений, +- `set.keys()` -- то же самое, что и `set.values()`, присутствует для обратной совместимости с `Map`, +- `set.entries()` -- возвращает перебираемый объект для пар вида `[значение, значение]`, присутствует для обратной совместимости с `Map`. ## Итого @@ -305,12 +305,12 @@ set.forEach((value, valueAgain, set) => { Методы и свойства: - `new Map([iterable])` -- создаёт коллекцию, можно указать перебираемый объект (обычно массив) из пар `[ключ,значение]` для инициализации. -- [`map.set(key, value)`](mdn:js/Map/set) -- записывает по ключу `key` значение `value`. -- [`map.get(key)`](mdn:js/Map/get)` -- возвращает значение по ключу или `undefined`, если ключ `key` отсутствует. -- [`map.has(key)`](mdn:js/Map/has) -- возвращает `true`, если ключ `key` присутствует в коллекции, иначе `false`. -- [`map.delete(key)`](mdn:js/Map/delete) -- удаляет элемент по ключу `key`. -- [`map.clear()`](mdn:js/Map/clear) -- очищает коллекцию от всех элементов. -- [`map.size`](mdn:js/Map/size) -- возвращает текущее количество элементов. +- `map.set(key, value)` -- записывает по ключу `key` значение `value`. +- `map.get(key)` -- возвращает значение по ключу или `undefined`, если ключ `key` отсутствует. +- `map.has(key)` -- возвращает `true`, если ключ `key` присутствует в коллекции, иначе `false`. +- `map.delete(key)` -- удаляет элемент по ключу `key`. +- `map.clear()` -- очищает коллекцию от всех элементов. +- `map.size` -- возвращает текущее количество элементов. Отличия от обычного объекта `Object`: @@ -322,10 +322,10 @@ set.forEach((value, valueAgain, set) => { Методы и свойства: - `new Set([iterable])` -- создаёт `Set`, можно указать перебираемый объект со значениями для инициализации. -- [`set.add(value)`](mdn:js/Set/add) -- добавляет значение (если оно уже есть, то ничего не делает), возвращает тот же объект `set`. -- [`set.delete(value)`](mdn:js/Set/delete) -- удаляет значение, возвращает `true` если `value` было в множестве на момент вызова, иначе `false`. -- [`set.has(value)`](mdn:js/Set/has) -- возвращает `true`, если значение присутствует в множестве, иначе `false`. -- [`set.clear()`](mdn:js/Set/clear) -- удаляет все имеющиеся значения. -- [`set.size`](mdn:js/Set/size) -- возвращает количество элементов в множестве. +- `set.add(value)` -- добавляет значение (если оно уже есть, то ничего не делает), возвращает тот же объект `set`. +- `set.delete(value)` -- удаляет значение, возвращает `true` если `value` было в множестве на момент вызова, иначе `false`. +- `set.has(value)` -- возвращает `true`, если значение присутствует в множестве, иначе `false`. +- `set.clear()` -- удаляет все имеющиеся значения. +- `set.size` -- возвращает количество элементов в множестве. Перебор `Map` и `Set` всегда осуществляется в порядке добавления элементов, так что нельзя сказать, что это -- неупорядоченные коллекции, но поменять порядок элементов или получить элемент напрямую по его номеру нельзя. diff --git a/1-js/06-advanced-functions/01-recursion/01-sum-to/solution.md b/1-js/06-advanced-functions/01-recursion/01-sum-to/solution.md index 7283fe945c..7c2b33c5d0 100644 --- a/1-js/06-advanced-functions/01-recursion/01-sum-to/solution.md +++ b/1-js/06-advanced-functions/01-recursion/01-sum-to/solution.md @@ -1,4 +1,3 @@ - Решение с помощью цикла: ```js run @@ -38,4 +37,4 @@ P.S. Надо ли говорить, что решение по формуле Вариант с циклом – второй по скорости. Он быстрее рекурсии, так как операций сложения столько же, но нет дополнительных вычислительных затрат на организацию вложенных вызовов. Поэтому рекурсия в данном случае работает медленнее всех. -P.P.S. Некоторые движки поддерживают оптимизацию "хвостового вызова": если рекурсивный вызов является самым последним в функции, без каких-либо других вычислений, то внешней функции не нужно будет возобновлять выполнение и не нужно запоминать контекст его выполнения. В итоге требования к памяти снижаются. Но если JavaScript-движок не поддерживает это (большинство не поддерживают), будет ошибка: максимальный размер стека превышен, так как обычно существует ограничение на максимальный размер стека. +P.P.S. Некоторые движки поддерживают оптимизацию "хвостового вызова": если рекурсивный вызов является самым последним в функции (`sumTo` выше не будет оптимизирован, т.к. последним происходит сложение, а не рекурсивный вызов), то внешней функции не нужно будет возобновлять выполнение и не нужно запоминать контекст его выполнения. В итоге требования к памяти снижаются, и сумма `sumTo(100000)` будет успешно вычислена. Но если JavaScript-движок не поддерживает это (большинство не поддерживают), будет ошибка: максимальный размер стека превышен, так как обычно существует ограничение на максимальный размер стека. diff --git a/1-js/06-advanced-functions/01-recursion/article.md b/1-js/06-advanced-functions/01-recursion/article.md index 171679bf7f..140935c420 100644 --- a/1-js/06-advanced-functions/01-recursion/article.md +++ b/1-js/06-advanced-functions/01-recursion/article.md @@ -1,4 +1,3 @@ - # Рекурсия и стек Вернёмся к функциям и изучим их более подробно. @@ -62,7 +61,7 @@ pow(2, 4) = 16 if n==1 = x / pow(x, n) = - \ + \ else = x * pow(x, n - 1) ``` @@ -516,7 +515,6 @@ list.next = list.next.next; ## Итого Термины: - - *Рекурсия* - это термин в программировании, означающий вызов функцией самой себя. Рекурсивные функции могут быть использованы для элегантного решения определённых задач. Когда функция вызывает саму себя, это называется *шагом рекурсии*. *База* рекурсии - это такие аргументы функции, которые делают задачу настолько простой, что решение не требует дальнейших вложенных вызовов. @@ -529,7 +527,7 @@ list.next = list.next.next; list = { value, next -> list } ``` - Деревья, такие как дерево HTML-элементов или дерево отделов из этой главы, также являются рекурсивными: у них есть ветви, и каждая ветвь может содержать другие ветви. + Деревья, такие как дерево HTML-элементов или дерево отделов из этой главы, также являются рекурсивными: они разветвляются, и каждая ветвь может содержать другие ветви. Как мы видели в примере `sumSalary`, рекурсивные функции могут быть использованы для прохода по ним.