Это обновление моего участия в конкурсе #100DaysOfCode.
В последнее время у меня был очень разносторонний опыт решения задач с точки зрения моей способности это делать. С некоторыми проблемами я могу сидеть и в конечном итоге работать, в то время как с другими проблемами я полностью потерян, практически не имея представления о том, как хотя бы отдаленно подойти к ним. Обычно именно в этих последних задачах я в конечном итоге смотрю на решения и работаю над ними, чтобы понять различные аспекты кода, и он работает так, как работает. Цель состоит, конечно же, в том, чтобы извлечь все возможные знания из каждой задачи, независимо от того, смогу ли я решить ее полностью самостоятельно или нет.
Задача, над которой я работал сегодня, была одной из таких задач. Чем больше я сидел с проблемой, тем более запутанным и обширным становилось решение. Было много возвратов, боковых маршрутов и ссылок, пока я, наконец, не уступил идее, что я НАМНОГО переосмыслил проблему. Я поддался, глядя на намеки. Это совсем не помогло. У меня уже были первые несколько подсказок, настроенных в моем собственном коде.
Когда я, наконец, посмотрел на решения и выбрал одно из них для работы, я заметил две вещи:
- Я определенно переосмыслил это. Фрагменты, которых мне не хватало, были значительно меньше, чем все, что я придумал в уме в качестве жизнеспособного пути к решению проблемы, и
- Было использование функции, которая сама по себе имела две вещи: это было что-то, о чем я никогда не слышал и на что не смотрел (евклидов алгоритм), и она была рекурсивной.
Конечно, это было рекурсивно.
let lcm = blah[0]; for (let i = 1; i < blah.length; i++) { var GCD = gcd(lcm, blah[i]); lcm = (lcm * blah[i]) / GCD; } return lcm; function gcd(x, y) { // Implements the Euclidean Algorithm if (y === 0) return x; else return gcd(y, x % y); }
Код скопирован, адаптирован.
Я подключил фрагменты кода к своему коду, и он заработал. Однако, все еще чувствуя себя обманутым, я рассмотрел и другие решения. Когда я вернулся к решению, которое выбрал для подражания, в одном из комментариев было предложено то, над чем я мог реально поработать: // can use reduce() in place of this block
.
Я использовал метод .reduce()
только мимоходом и обычно для суммирования значений в массиве. Однако блок, который я должен был заменить, имел несколько более сложную функцию для рефакторинга. Поэтому я начал копаться в Google, чтобы лучше понять .reduce()
и посмотреть, смогу ли я понять, как заменить эти пять строк кода всего одной.
Во-первых, позвольте мне сказать вам, что попытка найти полезную информацию о методе .reduce()
, которая не повторялась снова и снова, была проблемой сама по себе. Почти в каждой статье, с которой я сталкивался, говорилось о .reduce()
с точки зрения суммирования значений в массиве.
Почти каждый. не замужем. бля. один.
Почти. К счастью, я наткнулся на две статьи, которые оказались полезными во многих отношениях. Первой была эта статья от gURLmeetsCode, в которой сравнивалась производительность между for
циклами и .reduce()
. Это было очень информативно с точки зрения зачем учиться использовать .reduce()
, так как теперь понятно, почему я хотел бы использовать его сверх того, что просто лучше выглядящий код.
Второй статьей была эта, написанная Дэвидом Уолшем, который привел ряд примеров, демонстрирующих множество способов использования .reduce()
. И это не было набором различных способов суммирования элементов массива. Он показал, как можно использовать .reduce()
для получения массива и возврата одного результата, каким бы он ни был. Работая с его примерами, я смог лучше понять, как я могу реорганизовать фрагменты кода, которые я использовал, из цикла for
в цикл .reduce()
. Путем проб и ошибок я получил вот это:
let lcm = blah[0]; for (let i = 1; i < blah.length; i++) { var GCD = gcd(lcm, blah[i]); lcm = (lcm * blah[i]) / GCD; }
в это:
let lcm = blah.reduce((lcm, i) => (lcm * i) / gcd(lcm, i));
Аааа, я кое-что узнал! Меня разочаровало то, что мне пришлось вернуться к сканированию решения, но, в конце концов, весь этот опыт был полезен, поскольку я узнал немного больше об одном из многих инструментов в моем наборе инструментов.
37/100