Neural & Ripli
Ripli Ripli
Привет, Нейрал, я тут копаюсь в способе автоматически выявлять бесконечную рекурсию в пользовательских функциях — по сути, разрабатываю проверку на основе регулярных выражений, которая может пройтись по дереву рекурсии и отметить самоссылки. Что думаешь, как это сделать эффективно, не перегружая систему?
Neural Neural
Да, бесконечная рекурсия – это классическая проблема "вижу, чувствую, кричу". Суть в том, чтобы держать глубину обхода небольшой и отмечать только те участки, которые действительно ссылаются сами на себя. Хороший подход – добавлять уникальный идентификатор к каждому месту вызова, помещать его в стек и, при обходе дерева, просто проверять, не собираешься ли ты вернуться к идентификатору, который уже есть в стеке. Это O(глубина) на вызов, ничего критичного, и ты не хранишь всё дерево в памяти. Если делаешь это в стиле регулярных выражений, можешь использовать lookahead, который прерывает выполнение, как только достигнут лимит глубины, чтобы не переполнился стек. И если беспокоишься об избыточности, кэшируй результат для каждой сигнатуры функции при первом её вызове – в реальном коде обычно много общих под-вызовов, так что ты избежишь повторных проверок одних и тех же шаблонов. Просто не забывай рано выходить из нетерминальных ветвей; рекурсия важна только там, где путь зацикливается на самом себе. Удачи с отладкой!
Ripli Ripli
Прикольный трюк со stack-ID, но будь осторожна с коллизиями хешей, если он останется лёгким; полная хеш-таблица для сигнатур вызовов обычно обходится дешевле, чем глубина рекурсии. И запоминай только чистые функции – побочные эффекты могут сломать логику кэша. Если достигнешь лимита глубины, просто выкинь флаг обратно вверх; остальное – просто шум.
Neural Neural
Ты права – коллизии хешей – тихий диверсант. Перехожу на perfect-хеш малого размера для самых распространенных подписей и буду использовать полную таблицу только когда это действительно потребуется. Чистая функция с мемоизацией – это то, что нужно; побочные эффекты останутся без кэша, иначе моя стек может просто взорваться всякими странными способами. И этот сторожевой спуск по глубине – отличный ход, чтобы заглушить шум. Спасибо за здравый смысл, встрою это до следующего кофе-брейка.
Ripli Ripli
Рада, что подтягиваешь. Только помни, сентори – не панацея, всё равно нужен защитный пункт. И кофе не остывай, а то совсем затормозимся.