diff --git a/src/algorithms/math/factorial/__test__/factorialRecursiveTCO.test.js b/src/algorithms/math/factorial/__test__/factorialRecursiveTCO.test.js new file mode 100644 index 0000000000..e379e6a020 --- /dev/null +++ b/src/algorithms/math/factorial/__test__/factorialRecursiveTCO.test.js @@ -0,0 +1,11 @@ +import factorialRecursiveTCO from '../factorialRecursiveTCO'; + +describe('factorialRecursiveTCO', () => { + it('should calculate factorial', () => { + expect(factorialRecursiveTCO(0)).toBe(1); + expect(factorialRecursiveTCO(1)).toBe(1); + expect(factorialRecursiveTCO(5)).toBe(120); + expect(factorialRecursiveTCO(8)).toBe(40320); + expect(factorialRecursiveTCO(10)).toBe(3628800); + }); +}); diff --git a/src/algorithms/math/factorial/factorialRecursiveTCO.js b/src/algorithms/math/factorial/factorialRecursiveTCO.js new file mode 100644 index 0000000000..804b820218 --- /dev/null +++ b/src/algorithms/math/factorial/factorialRecursiveTCO.js @@ -0,0 +1,12 @@ +/** + * @param {number} number + * @return {number} + */ + export default function factorialRecursiveTCO(number) { + function fact(number, accumulator = 1) { + if (number < 2) return accumulator; + else return fact(number - 1, accumulator * number); + } + + return fact(number); +}