DEV Community

Cover image for Javascript factorial
Ticha Godwill Nji
Ticha Godwill Nji

Posted on

Javascript factorial

Hey everyone!

I've stumbled upon this interesting JavaScript code that calculates the factorial of a number, and I'd love to hear your thoughts on it!


function factorial(n) {
    if (n === 0 || n === 1) {
        return 1;
    } else {
        return n * factorial(n - 1);
    }
}

// Test the factorial function
const num = 5;
console.log(`Factorial of ${num} is: ${factorial(num)}`);

Enter fullscreen mode Exit fullscreen mode

Discussion Points:

  • Logic in the Code: Can you explain how the factorial function works, especially the recursive part?

  • Test Case: The code tests the factorial function with the number 5. How would you test it with different numbers?

  • Recursion: What are your thoughts on using recursion to solve this problem? Are there alternative approaches you would consider?

  • Improvements: Are there any improvements or optimizations you would suggest for this code?

Explore more on my Youtube channel

Feel free to share your insights, questions, or any other comments you have about the code!

Let's dive in and explore together! πŸš€πŸ”

Top comments (11)

Collapse
 
sakko profile image
SaKKo
const factorialMemo = {}
function factorial(n) {
  if (n === 0 || n === 1) {
    return 1;
  }
  if (!factorialMemo[n]) {
    factorialMemo[n] = n * factorial(n - 1)
  }
  return factorialMemo[n];
}
Enter fullscreen mode Exit fullscreen mode

For me, I would prefer to memoize the result. I'm not too worried about coding styles. As long as it is easy to read and it's correctly computed.

Collapse
 
ticha profile image
Ticha Godwill Nji

There are many coding styles and it is worth noting that one size doesn't fit all. So, it is totally ok to have your own coding style as long as the code follows the code practices and industry standards.

Collapse
 
sakko profile image
SaKKo

My point is just to improve performance.

Thread Thread
 
ticha profile image
Ticha Godwill Nji

I get it

Collapse
 
efpage profile image
Eckehard • Edited

You can use a simple loop, but recursion can be shorter:

   // Loop
    function fac1(n) {
      let k = 1
      for (let i = 1; i <= n; i++)
        k = k * i
      return k
    }

Enter fullscreen mode Exit fullscreen mode

With respect to your code: Why not check for (n <= 1) ? And this is a perfect case for the ternary operator, so your code could look like this:

    function factorial(n) {
       return (n <= 1) ?  1 : n * factorial(n - 1);
    }
Enter fullscreen mode Exit fullscreen mode
Collapse
 
ticha profile image
Ticha Godwill Nji

Smart thinking.

Collapse
 
efpage profile image
Eckehard

Thank you much!

Talking about improvements: else after return is superfluous. So, your unchanged code should look like this:

function factorial(n) {
    if (n === 0 || n === 1) 
        return 1;
    return n * factorial(n - 1);
}
Enter fullscreen mode Exit fullscreen mode

And your code is a bit dangerouse: see what happens, if you try factorial(-1). Checking for <=1 covers this too....

Thread Thread
 
ticha profile image
Ticha Godwill Nji

Thank you for pointing this out to me. It should cover negative numbers

Collapse
 
jonrandy profile image
Jon Randy πŸŽ–οΈ • Edited

😝

// Loop
const fac = (n, k=1) => {for (;n--;k*=n+1){} return k}
Enter fullscreen mode Exit fullscreen mode
Collapse
 
ticha profile image
Ticha Godwill Nji

Smart thinking @jonrandy

Collapse
 
aminnairi profile image
Amin