Какво е рекурсия на опашката?

В компютърното програмиране, рекурсията на опашката е използването на опашка за изпълнение на рекурсивна функция. Извикването на опашката е когато функцията се нарича последен акт на друга функция. Например в тази програма на JavaScript:

 var myTailFunc = function (myVar) {върнете myVar; }; var myFunc = function (myVar) {върнете myTailFunc (myVar); }; 

Тук повикването към myTailFunc (myVar) е опашка, защото е последната операция на myFunc (myVar) . Когато компилаторът види, че това е крайната операция на myFunc, той може да извърши малка оптимизация. По същество не е необходимо да връща адрес за връщане в стека, тъй като няма да се налага да се връща към myFunc . Може да върне връщаната стойност на myTailFunc като връщаната стойност на myFunc .

Тази малка оптимизация става по-значима, когато се използва в рекурсивна функция. Обикновено всяко ниво на рекурсия изисква допълнителен обратен адрес, който да бъде избутан в стека. Рекурсията на опашката прави това ненужно.

Ето един пример за проста факторна функция на JavaScript, написана първо без и след това с рекурсия на опашката.

Факториална функция без рекурсия на опашката

 var factorial = функция (n) {if (n == 0) {return 1; } else {върнете n * факториал (n - 1); }}; 

Тази функция е рекурсивна, но не рекурсивна. Крайният процес на функцията е операцията за умножение (" * "), така че рекурсията винаги ще трябва да се върне към функцията за повикване.

Факториална функция с рекурсия на опашката

 var factorial = функция (n) {var recursion = функция (n, subTotal) {if (n == 0) {return subTotal; } else {рекурсия на връщане (n - 1, n * subTotal); }}; връщане на рекурсия (n, 1); }; 

Функция, програмни термини