From 02c1e27a02d69a98e9a779035cd71587fcf5e787 Mon Sep 17 00:00:00 2001 From: sarthakgupta1907-cell Date: Sat, 7 Nov 2026 01:53:57 +0530 Subject: [PATCH] feat: add Tribonacci number algorithm --- Maths/TribonacciNumber.js | 28 +++++++++++++++++++ Maths/test/TribonacciNumber.test.js | 43 +++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 Maths/TribonacciNumber.js create mode 100644 Maths/test/TribonacciNumber.test.js diff --git a/Maths/TribonacciNumber.js b/Maths/TribonacciNumber.js new file mode 100644 index 0000000000..d0c7cc2c17 --- /dev/null +++ b/Maths/TribonacciNumber.js @@ -0,0 +1,28 @@ +/** + * @function tribonacciNumber + * @description The Tribonacci sequence is similar to Fibonacci but each + * number is the sum of the three preceding ones. + * Sequence: 0, 0, 1, 1, 2, 4, 7, 13, 24, 44... + * @param {number} n - The position in the Tribonacci sequence (0-indexed) + * @returns {number} - The nth Tribonacci number + * @see https://en.wikipedia.org/wiki/Generalizations_of_Fibonacci_numbers#Tribonacci_numbers + * @example tribonacciNumber(0) => 0 + * @example tribonacciNumber(4) => 2 + * @example tribonacciNumber(7) => 13 + */ +const tribonacciNumber = (n) => { + if (!Number.isInteger(n) || n < 0) { + throw new TypeError('Input must be a non-negative integer') + } + if (n === 0 || n === 1) return 0 + if (n === 2) return 1 + let a = 0 + let b = 0 + let c = 1 + for (let i = 3; i <= n; i++) { + ;[a, b, c] = [b, c, a + b + c] + } + return c +} + +export { tribonacciNumber } diff --git a/Maths/test/TribonacciNumber.test.js b/Maths/test/TribonacciNumber.test.js new file mode 100644 index 0000000000..250ad0230f --- /dev/null +++ b/Maths/test/TribonacciNumber.test.js @@ -0,0 +1,43 @@ +import { tribonacciNumber } from '../TribonacciNumber.js' + +describe('tribonacciNumber', () => { + test('tribonacciNumber(0) returns 0', () => { + expect(tribonacciNumber(0)).toBe(0) + }) + + test('tribonacciNumber(1) returns 0', () => { + expect(tribonacciNumber(1)).toBe(0) + }) + + test('tribonacciNumber(2) returns 1', () => { + expect(tribonacciNumber(2)).toBe(1) + }) + + test('tribonacciNumber(3) returns 1', () => { + expect(tribonacciNumber(3)).toBe(1) + }) + + test('tribonacciNumber(4) returns 2', () => { + expect(tribonacciNumber(4)).toBe(2) + }) + + test('tribonacciNumber(5) returns 4', () => { + expect(tribonacciNumber(5)).toBe(4) + }) + + test('tribonacciNumber(7) returns 13', () => { + expect(tribonacciNumber(7)).toBe(13) + }) + + test('tribonacciNumber(8) returns 24', () => { + expect(tribonacciNumber(8)).toBe(24) + }) + + test('throws TypeError for negative input', () => { + expect(() => tribonacciNumber(-1)).toThrow(TypeError) + }) + + test('throws TypeError for float input', () => { + expect(() => tribonacciNumber(1.5)).toThrow(TypeError) + }) +})