“Factorialize a Number”

function factorialize(num){
if(num <= 1) return 1;
return (num * factorialize(num-1));
}

factorialize(5);
// return 120

hi! i have doubt regarding "return " . The return statement ends function execution and specifies a value to be returned to the function caller. So return (num * factorialize(num-1)); how is this code working?

function factorialize(num){
    if(num <= 1) return 1;
    
    return (num * factorialize(num-1));
}

Let’s simply track what happens when num = 3. I’ll call factorialize simply f.

#1 ( 3 * f(2) )             // f(2) must return to its caller #1
#2 ( 3 * ( 2 * f(1) ) )     // f(1) must return to its caller #2
#3 ( 3 * ( 2 * (1 * 1) ) ) // At this point, there is no more recursive calls.
#3 ( 3 * ( 2 * (1) ) )     // #3 returning to #2
#2 ( 3 * ( 2 ) )          // #2 returning to #1
#1 ( 6 )                  // #1 returning to the original caller.

In the first step, the return statement ends up calling f(2). To compute 3 * f(2), we must resolve f(2) because it is a function call.

So, the function must wait for f(2) to return. f(2) must return to the caller, function context #1.

The same process goes on until no further call is made to itself.

Then, the rest is each function context returning to previous caller.

2 Likes

You’re right that the return statement ends function execution, however it first evaluates the expression it is to return!

So essentially it is forced to calculate the value of factorialize(num - 1) before the function ends, which progresses as the previous answer says.

See @gunhoo93’s answer for what exactly this entails, and how the values ‘propagate’ back to the topmost function

1 Like