user5369036
user5369036

Reputation: 13

Why is my recursive function call not returning a value?

I have the following code, trying to return the range between two numbers, and the inner function is not returning a value. It simply returns [Function]. Can anyone tell me why?

var range = function(num1, num2) {
    var output = [];  
    return function range2 () {
        if (num2 - num1 === 2) {
            return [num1+1];
        }
        else if (output.length + 1 === num2 - num1) {
            return output;
        }
        else if (output.length + 1 !== num2 - num1) {
            output.push(num1 + 1);
        }
        return range2(num1 + 1, num2);
    };
};

//UPDATE: This is my code that ended up working, FWIW:

var range = function(num1, num2) {
    var list = [];
    var range2 = function(num1, num2) {
        list.push(num1 + 1);
        if (num2 - num1 === 2) {
            return list;
        }
        else {
            return range2(num1 + 1, num2);
        }
    };
    return range2(num1, num2);
};

Upvotes: 0

Views: 61

Answers (2)

Barmar
Barmar

Reputation: 780798

The range() function never calls range2(). It simply returns the function expression.

Also, range2() needs to take arguments.

var range = function(num1, num2) {
  var output = [];

  function range2(num1, num2) {
    if (num2 - num1 === 2) {
      return [num1 + 1];
    } else if (output.length + 1 === num2 - num1) {
      return output;
    } else if (output.length + 1 !== num2 - num1) {
      output.push(num1 + 1);
    }
    return range2(num1 + 1, num2);
  };
  return range2(num1, num2);
};

alert(range(1, 10));

Upvotes: 0

Fallenreaper
Fallenreaper

Reputation: 10682

Your return will return the definition. If you are trying to return the execution of the function you will need to add a ()

See here:

var range = function(num1, num2) {
  var output = [];  
  return function range2 () {
    if (num2 - num1 === 2) {
        return [num1+1];
    }
    else if (output.length + 1 === num2 - num1) {
        return output;
    }
    else if (output.length + 1 !== num2 - num1) {
        output.push(num1 + 1);
    }
    return range2(num1 + 1, num2);
  }();  // <----  this will execute the defined function.
};

Upvotes: 1

Related Questions