recursion - Utility to encapsulate tail-call optimisation in JavaScript? -


i've been reading recursive functions , tail call optimisation (tco) in javascript. goal overcome stack overflow in recursive function:

function factorial(n) {     function recur(n, acc) {         if (n === 0) {             return acc;         } else {             return recur(n - 1, n * acc);         }     }     return recur(n, 1); }  factorial(5); // 120 console.log(factorial(4585759)); // maximum call stack size exceeded 

i have found how use thunk , trampoline overcome stack overflow in recursive function:

let thunk = function (fn) {     return function() {         let args = array.prototype.slice.apply(arguments);         return function() { return fn.apply(this, args); };     }; };  function trampoline(f) {     while (f && f instanceof function) {         f = f();     }     return f; }  function factorial(n) {     let recur = function(x, n) {         if (n === 0) {             return x;         } else {             return thunk(recur)(n * x, n - 1);         }     };     return trampoline(thunk(recur)(1, n)); }  console.log(factorial(5)); // 120 console.log(factorial(4585759)); // infinity 

however, didn't way i'm forced write recursive function. found implementations of function named tco:

function tco(fn) {   var active, nextargs;   return function() {     var result;     nextargs = arguments;     if (!active) {       active = true;       while (nextargs) {         result = fn.apply(this, [nextargs, nextargs = null][0]);       }       active = false;     }     return result;   }; } 

the function should allow following:

let factorialtoc = tco(function(n) {     function recur(n, acc) {         if (n === 0) {             return acc;         } else {             return recur(n - 1, n * acc);         }     };     return recur(n, 1); }); 

but not working:

factorialtoc(5); // 120 console.log(factorialtoc(4585759)); // maximum call stack size exceeded 

is there utility functions encapsulate tco?

you applied tco function non-recursive factorialtoc function, not recur leads stack overflow. should rather be

function factorialtoc(n) {     const recur = tco(function(n, acc) {         if (n === 0) {             return acc;         } else {             return recur(n - 1, n * acc);         }     });     return recur(n, 1); } 

Comments

Popular posts from this blog

javascript - jQuery: Add class depending on URL in the best way -

caching - How to check if a url path exists in the service worker cache -

Redirect to a HTTPS version using .htaccess -