1

I am new to JavaScript and am trying to understand an example from the book. When I step through this example, I expect the value of fac(4) to be 12. That would be the result of (4 - 1) * 4.

However, when I run the code from the online book (near bottom of page) at http://eloquentjavascript.net/00_intro.html, I get the value 24. What am I missing here?

function fac(n) {
  if (n == 0)
    return 1;
  else
    return fac(n - 1) * n;
}
console.log(fac(4));

I have tried to find an answer through Twitter and through online research but have been unsuccessful. I know I am overlooking something, but can't seem to see it.

3
  • 1
    Play computer-trace out the execution for every step. Commented Dec 21, 2014 at 23:57
  • 1
    This is the "Hello World" of recursive functions. ;-) It's actually simpler and very much faster to calculate a factorial without recursion, but there you go. Commented Dec 22, 2014 at 0:52
  • Never covered this in school (got my degree in social work), but I just spent about an hour on it and I think I've got it. Both answers below are very helpful. Commented Dec 22, 2014 at 1:03

2 Answers 2

4

Because it is recursive.

function fac(n) {
  if (n == 0)
    return 1;
  else
    return fac(n - 1) * n;
}
console.log(fac(4));

So let's trace it

fac(3) * 4;
fac(2) * 3 * 4;
fac(1) * 2 * 3 * 4;
fac(0) * 1 * 2 * 3 * 4;
1 * 1 * 2 * 3 * 4;

And of course, that is 24.

Sign up to request clarification or add additional context in comments.

Comments

3

If you notice your code, at line 5 this function is calling itself, this is called recursion, read more about it on wikipedia

Lets comeback to your code and dry run it to see how it works. lets give each line a number so we can refer it

1.function fac(n) {
2.  if (n == 0)
3.    return 1;
4.  else
5.    return fac(n - 1) * n;
6.}
7.console.log(fac(4));

your input value is 4 for first call lets call it call A.

for value 4 if condition at line 1 will return false so it would go to line 5 which again calls

fac(3) * 4;

now your function call A is paused here and makes a call B with value 3. Result of call A is yet to be evaluated.

Now with value 3 this if condition at line 2 will return false again and code at line 5 will execute like above; i.e.

fac(2) * 3;

call B paused here and there will be call C with input 2 of the same function.

on call C you code will return false against if condition at line 2 so it will make call D with input 1. i.e.

fac(1) * 2

For call D if condition at line 2 will return true and your function will return 1 so the call D gets evaluated at with value 1. now replace each fac(n) from bottom to top and keep on evaluating each call.

result of call D => 1  
result of call C => fac(1) * 2 => 1 * 2 => 2  
result of call B => fac(2) * 3 => 2 * 3 => 6  
result of call A => fac(3) * 4 => 6 * 4 => 24

I hope you will be able to understand how it really works, important point in recursion is the stop condition which you code has it at line 2.

Above result can also be produced by using loops but using recursion is more fun.

Happy Coding :)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.