Шта је репурзија репа?

У компјутерском програмирању, репурзија репа је употреба репног позива за извођење рекурзивне функције. Позив репа је када се функција назове као последњи чин друге функције. На пример, у овом ЈаваСцрипт програму:

 вар миТаилФунц = функција (миВар) {ретурн миВар; }; вар миФунц = функција (миВар) {ретурн миТаилФунц (миВар); }; 

Овде, позив на миТаилФунц (миВар) је реп позив јер је то последња операција миФунц (миВар) . Када компајлер види да је то последња операција миФунц, она може да изврши малу оптимизацију. У суштини, не треба да гурне повратну адресу у стацк, јер неће морати да се враћа на миФунц . Може вратити повратну вриједност миТаилФунц као повратну вриједност миФунц .

Ова мала оптимизација постаје значајнија када се користи у рекурзивној функцији. Нормално, за сваки ниво рекурзије би била потребна додатна повратна адреса која би била постављена на стог. Рекурзија репа чини ово непотребним.

Ево примера једноставне ЈаваСцрипт факторске функције написане прво без, а затим са репурзије репа.

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

 вар фацториал = фунцтион (н) {иф (н == 0) {ретурн 1; } елсе {ретурн н * фацториал (н - 1); }}; 

Ова функција је рекурзивна, али не репурзивна. Завршни процес функције је операција множења (" * "), тако да ће се рекурзија увијек морати вратити на функцију позивања.

Факторска функција са репурзијом репа

 вар фацториал = фунцтион (н) {вар рецурсион = фунцтион (н, субТотал) {иф (н == 0) {ретурн субТотал; } елсе {повратна рекурзија (н - 1, н * субТотал); }}; повратна рекурзија (н, 1); }; 

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