From 0ec1493d86cc7794a3c336a814c510bca3dce293 Mon Sep 17 00:00:00 2001 From: sarthakgupta1907-cell Date: Sat, 7 Nov 2026 01:51:15 +0530 Subject: [PATCH] feat: add Catalan number algorithm --- Maths/CatalanNumber.js | 25 ++++++++++++++++++++ Maths/test/CatalanNumber.test.js | 39 ++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 Maths/CatalanNumber.js create mode 100644 Maths/test/CatalanNumber.test.js diff --git a/Maths/CatalanNumber.js b/Maths/CatalanNumber.js new file mode 100644 index 0000000000..db1003016c --- /dev/null +++ b/Maths/CatalanNumber.js @@ -0,0 +1,25 @@ +/** + * @function catalanNumber + * @description Catalan numbers are a sequence of natural numbers with + * many applications in combinatorics. The nth Catalan number is given + * by: C(n) = (2n)! / ((n+1)! * n!) + * @param {number} n - A non-negative integer + * @returns {number} - The nth Catalan number + * @see https://en.wikipedia.org/wiki/Catalan_number + * @example catalanNumber(0) => 1 + * @example catalanNumber(3) => 5 + * @example catalanNumber(5) => 42 + */ +const catalanNumber = (n) => { + if (!Number.isInteger(n) || n < 0) { + throw new TypeError('Input must be a non-negative integer') + } + if (n === 0 || n === 1) return 1 + let result = 0 + for (let i = 0; i < n; i++) { + result += catalanNumber(i) * catalanNumber(n - 1 - i) + } + return result +} + +export { catalanNumber } diff --git a/Maths/test/CatalanNumber.test.js b/Maths/test/CatalanNumber.test.js new file mode 100644 index 0000000000..754d14305f --- /dev/null +++ b/Maths/test/CatalanNumber.test.js @@ -0,0 +1,39 @@ +import { catalanNumber } from '../CatalanNumber.js' + +describe('catalanNumber', () => { + test('catalanNumber(0) returns 1', () => { + expect(catalanNumber(0)).toBe(1) + }) + + test('catalanNumber(1) returns 1', () => { + expect(catalanNumber(1)).toBe(1) + }) + + test('catalanNumber(2) returns 2', () => { + expect(catalanNumber(2)).toBe(2) + }) + + test('catalanNumber(3) returns 5', () => { + expect(catalanNumber(3)).toBe(5) + }) + + test('catalanNumber(4) returns 14', () => { + expect(catalanNumber(4)).toBe(14) + }) + + test('catalanNumber(5) returns 42', () => { + expect(catalanNumber(5)).toBe(42) + }) + + test('catalanNumber(6) returns 132', () => { + expect(catalanNumber(6)).toBe(132) + }) + + test('throws TypeError for negative input', () => { + expect(() => catalanNumber(-1)).toThrow(TypeError) + }) + + test('throws TypeError for float input', () => { + expect(() => catalanNumber(1.5)).toThrow(TypeError) + }) +})