Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Javascript: initializing a variable once (like a static variable) in a recursive function

I have a recursive function, which returns the leaf nodes of a tree (which is in the form of nested objects):

var retrieve = function (a)
{
    if (typeof retrieve.names == 'undefined') //would be true for the 1st pass only
        retrieve.names = []
    if (a.left != null)
        retrieve (a.left)
    if (a.right != null)
        retrieve (a.right)
    if (a.left == null && a.right == null)
        retrieve.names.push(a)
    return retrieve.names
}

The problem with this function is, it works perfectly fine for a single object (tree), but when another object is passed in the parameter, it simply appends the leaf nodes to the leaf nodes already obtained from the previous tree.

For instance,

// gets the leaf nodes of obj1 tree
obj1_leaves = retrieve(obj1) 

// instead of only getting leaf nodes of obj2, it appends them to leaf nodes of obj1
obj2_leaves = retrieve(obj2) 

Now the reason for this is typeof retrieve.names == 'undefined' is true only for first time. Whenever this function is invoked again, the member names of the retrieve function (which can also be considered as an object) is already set/initialized.

Is there a way to set a variable (or member of an object) inside a recursive function for a given function call only, and then unset/set it again for another function call.

like image 299
Saad Avatar asked Jul 21 '26 16:07

Saad


1 Answers

You can use an inner function:

function retrieve(a) {
  var names = [];
  function _retrieve(a) {
    if (a.left != null)
      _retrieve (a.left)
    if (a.right != null)
      _retrieve (a.right)
    if (a.left == null && a.right == null)
      names.push(a)
   }
   _retrieve(a);
   return names;
}

The outer function initializes the empty array as a local variable. The inner function does essentially the same work as your original function, but it references that local array.

Every time retrieve() is called, a new local array is created and used to traverse the tree.

like image 170
Pointy Avatar answered Jul 24 '26 06:07

Pointy



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!