Что такое рекурсия хвоста?

В компьютерном программировании хвостовая рекурсия - это использование хвостового вызова для выполнения рекурсивной функции. Конечный вызов - это когда функция вызывается как последний акт другой функции. Например, в этой программе 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); }; 

Функция, условия программирования