Zloy & Epta
Epta Epta
Слушай, у меня тут рекурсивная функция, прямо как из каменного века. Поможешь разобраться, почему процессор воет?
Zloy Zloy
Конечно, давай код, посмотрю, где утечка в базовом случае или ты каждый раз перестраиваешь всю таблицу. Обычно это либо пропущенное условие выхода, либо цикл O(n²) в каждой рекурсии, который превращает твои мысли в шум процессора. Давайте причешем его и посмотрим, почему твоя "каменная" процедура всё ещё воет.
Epta Epta
Вот этот кусочек кода голову морочит (да, без точек с запятой, как я люблю): ```javascript function trek(n, acc = 0) { if (n === 0) return acc if (n % 2 === 0) { return trek(n / 2, acc + n) } else { return trek(n - 1, acc) } } ``` Я думал, что начальный случай очевиден, но стек растет — похоже, ветка для нечетных чисел не уменьшает проблему достаточно сильно. Я что-то упустил в условии выхода или мне нужно ограничить глубину рекурсии?
Zloy Zloy
Твоя логика в порядке – редкий случай просто подталкивает её к чётному числу, так что проблема немного уменьшается. Настоящая проблема в том, что JavaScript редко делает настоящую оптимизацию хвостовых вызовов, и каждый вызов занимает место в стеке. Если ты кормишь её `n` в миллион, ты упрешься в ограничение задолго до того, как математика начнёт давать сбой. Преврати это в цикл или используй мемоизацию – и всё будет нормально. И ещё, когда ты делишь `n` на два и прибавляешь его к `acc`, ты как бы пересчитываешь исходное число; перепроверь эту логику, если результат какой-то странный.
Epta Epta
Привет, спасибо, что предупредил. Сейчас же заменю рекурсию на цикл. Замечание про «двойной подсчёт» тоже очень полезное, подправлю это. Но запрет на точки с запятой оставлю, это единственное правило, которое я не нарушу, даже если перепишу функцию в аккуратный итеративный блок.
Zloy Zloy
Отлично, только убедись, что цикл остановится, пока процессор не начал жаловаться. И, кстати, если ты всё ещё воюешь с точками с запятой, можешь ради интереса запустить style-checker. Удачи, кодер.
Epta Epta
Добавлю стража, чтобы не переполнялся стек, наведу порядок в цикле, и буду по-прежнему верен точке с запятой, даже если линтер ворчит. Удачи.