Recursion query

I’m trying to understand recursion. I came up with a function that calculates the sum of numbers in a range. In this case it’s numbers from 3 to 10.

var limit = 10;
function sumRange(value){
 if(value===limit){
   return value;
 }
  return value+sumRange(value+1);
}

sumRange(3);

Written like this the function seems to work fine with the limit being declared before the function.
However, when I refactor the code to look like this

function sumRange(value,limit){
 if(value===limit){
   return value;
 }
  return value+sumRange(value+1);
}

sumRange(3,10);

I get a ‘Maximum call stack size exceeded’ error. Can you help me understand why? Many thanks!

if(value===limit) doesn’t work. It needs an actual value that will terminate the recursion.

2 Likes
function sumRange(value,limit){
 if(value===limit){
   return value;
 }
  return value + sumRange(value+1);
}

You’re not passing a limit when you recurse, and value will never equal undefined, so you’re hosed. You can use closures to your advantage by creating a helper function inside of your main function.

1 Like

Thanks very much for your response. Could you give me an example of a helper function that would work in this case?

One possibility:

function sumRange(value, limit) {
    return _s(value);

    function _s(value) {
        if(value === limit) return value;
        return value + _s(value + 1);
    }
}
1 Like

Cool! So with each recursion it returns the current value, then proceeds to compare that to the limit and either returns the current value or runs the function again until value===limit.
Many thanks!!!