Mis on saba rekursioon?

Arvuti programmeerimisel on saba rekursioon saba kõne kasutamine rekursiivse funktsiooni täitmiseks. Saba kõne on, kui funktsiooni nimetatakse teise funktsiooni viimaseks toimeks. Näiteks selles JavaScript-programmis:

 var myTailFunc = funktsioon (myVar) {tagasi myVar; }; var myFunc = funktsioon (myVar) {tagasi myTailFunc (myVar); }; 

Siin on kõne myTailFuncile (myVar) sabakõne, sest see on viimane myFunc (myVar) toiming . Kui kompilaator näeb, et see on myFunci viimane toiming, võib see teostada väikese optimeerimise. Põhimõtteliselt ei pea see tagastamisaadet stackile panema, sest see ei pea tagasi myFunci . See võib tagastada myTailFunc tagastusväärtuse kui myFunc tagastusväärtust .

See väike optimeerimine muutub olulisemaks, kui seda kasutatakse rekursiivses funktsioonis. Tavaliselt nõuab iga rekursiooni tase täiendavat tagasipöördeaadressi, mis tuleb panna virnale. Saba rekursioon muudab selle tarbetuks.

Siin on näide lihtsast JavaScripti faktoorifunktsioonist, mis on kirjutatud kõigepealt saba rekursiooniga ja seejärel koos sellega.

Faktorfunktsioon ilma saba rekursioonita

 var factorial = funktsioon (n) {if (n == 0) {tagasi 1; } else {return n * faktoriaal (n - 1); }}; 

See funktsioon on rekursiivne, kuid mitte saba rekursiivne. Funktsiooni viimane protsess on korrutustoiming (" * "), seega peab rekursioon alati pöörduma tagasi helistajafunktsiooni.

Faktorfunktsioon saba rekursiooniga

 var factorial = funktsioon (n) {var recursion = funktsioon (n, subTotal) {if (n == 0) {tagasipöörduv subTotal; } else {tagasipöördumine (n - 1, n * subTotal); }}; tagasipöördumise rekursioon (n, 1); }; 

Funktsioon, programmeerimise tingimused