В компьютерном программировании хвостовая рекурсия - это использование хвостового вызова для выполнения рекурсивной функции. Конечный вызов - это когда функция вызывается как последний акт другой функции. Например, в этой программе JavaScript:
var myTailFunc = function (myVar) {return myVar; }; var myFunc = function (myVar) {return myTailFunc (myVar); };
Здесь вызов myTailFunc (myVar) является хвостовым вызовом, потому что это последняя операция myFunc (myVar) . Когда компилятор видит, что это последняя операция myFunc, он может выполнить небольшую оптимизацию. По сути, ему не нужно помещать адрес возврата в стек, потому что ему не нужно возвращаться к myFunc . Может возвращать возвращаемое значение myTailFunc как возвращаемое значение myFunc .
Эта небольшая оптимизация становится более значимой при использовании в рекурсивной функции. Обычно каждый уровень рекурсии требует дополнительного адреса возврата, который должен быть помещен в стек. Хвостовая рекурсия делает это ненужным.
Вот пример простой факториальной функции JavaScript, написанной сначала без, а затем с хвостовой рекурсией.
Факторная функция без хвостовой рекурсии
var factorial = function (n) {if (n == 0) {return 1; } else {return n * factorial (n - 1); }};
Эта функция является рекурсивной, но не хвостовой. Последний процесс функции - операция умножения (« * »), поэтому рекурсия всегда должна возвращаться к вызывающей функции.
Факторная функция с хвостовой рекурсией
var factorial = function (n) {var recursion = function (n, subTotal) {if (n == 0) {return subTotal; } else {возврат рекурсии (n - 1, n * subTotal); }}; возвратная рекурсия (n, 1); };
Функция, условия программирования