function factorial(n) { // Base case: factorial of 0 or 1 is 1 if (n === 0 || n === 1) { return 1; } else { // Recursive case: n! = n * (n-1)! return n * factorial(n - 1); } } // Example usage: const result = factorial(5); console.log(result); // Output: 120 function factorialIterative(n) { let result = 1; for (let i = 2; i <= n; i++) { result *= i; } return result; } const result1 = factorialIterative(6); console.log(result1); // Output: 720 function factorialTernary(n) { return (n === 0 || n === 1) ? 1 : n * factorialTernary(n - 1); } const result2 = factorialTernary(4); console.log(result2); // Output: 24 function factorialWhileLoop(n) { let result = 1; while (n > 1) { result *= n; n--; } return result; } const result3 = factorialWhileLoop(4); console.log(result3); // Output: 24 const factorialES6 = n => (n === 0 || n === 1) ? 1 : n * factorialES6(n - 1); const result4 = factorialES6(5); console.log(result4); // Output: 120 const factorialES6Iterative = (n, result = 1) => { for (let i = 2; i <= n; i++) { result *= i; } return result; }; const result5 = factorialES6Iterative(5); console.log(result5); // Output: 120 const factorialES6Reduce = n => [...Array(n).keys()].reduce((acc, val) => acc * (val + 1), 1); const result6 = factorialES6Reduce(6); console.log(result6); //720 const factorialMemoized = (function() { const memo = {}; function factorial(n) { if (n === 0 || n === 1) { return 1; } // Check if the result is already memoized if (memo[n]) { return memo[n]; } // Calculate and memoize the result memo[n] = n * factorial(n - 1); return memo[n]; } return factorial; })(); // Example usage: const result7 = factorialMemoized(5); console.log(result7); // Output: 120 const factorialFunctional = n => Array.from({ length: n }, (_, i) => i + 1).reduce((acc, val) => acc * val, 1); const result8 = factorialFunctional(5); console.log(result8); // Output: 120 //------------------------------------ const compose = (...functions) => input => functions.reduceRight((acc, fn) => fn(acc), input); const range = n => Array.from({ length: n }, (_, i) => i + 1); const multiply = (a, b) => a * b; const factorialComplex = n => compose( result => console.log(result), // Display the result (optional) numbers => numbers.reduce(multiply, 1), // Multiply all numbers in the array range, // Generate an array of numbers from 1 to n )(n); //----------------------- const factorialUsingMap = n => { return Array.from({ length: n }, (_, i) => i + 1) .map(number => BigInt(number)) // Convert numbers to BigInt to handle larger factorials .reduce((acc, val) => acc * val, BigInt(1)); }; // Example usage: const result9 = factorialUsingMap(5); console.log(result9.toString()); // Output: 120 const factorialUsingIIFEES6 = ((n) => { const calculateFactorial = (num, result = BigInt(1)) => { if (num === 0 || num === 1) { return result; } return calculateFactorial(num - 1, result * BigInt(num)); }; return calculateFactorial(n); })(5); // Pass the desired input to the IIFE console.log(factorialUsingIIFEES6.toString()); // Output: 120