diff --git a/DIRECTORY.md b/DIRECTORY.md index 5b8240d8d..07d898989 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -115,6 +115,7 @@ * [PerfectCube](https://github.com/TheAlgorithms/Javascript/blob/master/Maths/PerfectCube.js) * [PerfectNumber](https://github.com/TheAlgorithms/Javascript/blob/master/Maths/PerfectNumber.js) * [PerfectSquare](https://github.com/TheAlgorithms/Javascript/blob/master/Maths/PerfectSquare.js) + * [PermutationAndCombination](https://github.com/TheAlgorithms/Javascript/blob/master/Maths/PermutationAndCombination.js) * [PiApproximationMonteCarlo](https://github.com/TheAlgorithms/Javascript/blob/master/Maths/PiApproximationMonteCarlo.js) * [Polynomial](https://github.com/TheAlgorithms/Javascript/blob/master/Maths/Polynomial.js) * [PrimeCheck](https://github.com/TheAlgorithms/Javascript/blob/master/Maths/PrimeCheck.js) diff --git a/Maths/PermutationAndCombination.js b/Maths/PermutationAndCombination.js new file mode 100644 index 000000000..1146230fb --- /dev/null +++ b/Maths/PermutationAndCombination.js @@ -0,0 +1,67 @@ +/** + * @details Calculates the number of permutations and combinations. + * @external_link (Permutation And Combinations)[https://www.geeksforgeeks.org/permutation-and-combination/] + */ + +/** + * @brief Calculates the factorial of the given number. + * @param num: integer + * @details Factorial of n = n * (n - 1) * (n - 2) * ... * 1 + * @returns integer: Factorial of the number. + NaN: if negative number is provided. + */ +const factorial = (n) => { + if (n >= 0) { + if (n === 0) { + return 1 + } else { + return n * factorial(n - 1) + } + } else { + return NaN + } +} + +/** + * @brief Calculates the number of Permutations from the given data. + * @param + * n: integer -> number of items. + * r: integer -> number of times n is taken. + * @returns integer: The number of permutations. + NaN: if negative number is provided. + */ +const permutation = (n, r) => { + return factorial(n) / factorial(n - r) +} + +/** + * @brief Calculates the number of Combinations from the given data. + * @param + * n -> number of items. + * r -> number of times n is taken. + * @returns integer: The number of combinations. + NaN: if negative number is provided. + */ +const combination = (n, r) => { + return factorial(n) / (factorial(r) * factorial(n - r)) +} + +// Exports the functions to be used in other files. +module.exports.factorial = factorial +module.exports.permutation = permutation +module.exports.combination = combination + +/** + * @example + + const funcs = require("./PermutationAndCombination.js"); + + console.log(funcs.factorial(5)); + console.log(funcs.permutation(5, 2)); + console.log(funcs.combination(5, 2)); + + * @output + 120 + 20 + 10 + */