Страницы

Поиск по вопросам

четверг, 21 февраля 2019 г.

Хвостовая рекурсия JS

Доброго времени суток. Не могу понять, почему копятся стеки вызовов функций в хвостовой рекурсии, если результаты предыдущего вызова далее не используются. Например:
function foo(x, acc) { if (x < 2) { return acc; } return foo(x - 1, acc * x); } foo(100000, 1); // Maximum call stack size exceeded


Ответ

Стандарт содержит следующее упоминание
Tail Position calls are only defined in strict mode code because of a common non-standard language extension (see 9.2.7) that enables observation of the chain of caller contexts.

Хвостовые вызовы могут быть определены только в strict mode, из-за нестандартного расширения языка (см 9.2.7), которое позволяет следить за цепочкой вызываемых контекстов.
Таким образом в соответствии со стандартом, хвостая рекурсия в строгом режиме будет обработана правильно.
Поддерживаемость на данный момент оставляет желать лучшего

Ну и да, как уже упоминалось: в примере в вопросе не хвостовая рекурсия, для нее нужно добавить return, а так же указать strict mode, в итоге код должен принять следующий вид
function foo(x, acc) { 'use strict' if (x < 2) { return acc; } return foo(x - 1, acc * x); }

Комментариев нет:

Отправить комментарий