From 4ea1ad0bb8a8d62c433b1bab3df3596ad23c0b12 Mon Sep 17 00:00:00 2001
From: trainer2001 <95953188+trainer2001@users.noreply.github.com>
Date: Sun, 12 Dec 2021 15:39:32 +0530
Subject: [PATCH 1/2] Add factorialRecursiveTCO

---
 .../math/factorial/factorialRecursiveTCO.js          | 12 ++++++++++++
 1 file changed, 12 insertions(+)
 create mode 100644 src/algorithms/math/factorial/factorialRecursiveTCO.js

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);
+}

From 9787af026702ea1311d67af1e4d50ec06d637533 Mon Sep 17 00:00:00 2001
From: trainer2001 <95953188+trainer2001@users.noreply.github.com>
Date: Sun, 12 Dec 2021 15:40:21 +0530
Subject: [PATCH 2/2] Add test for factorialRecursiveTCO

---
 .../factorial/__test__/factorialRecursiveTCO.test.js  | 11 +++++++++++
 1 file changed, 11 insertions(+)
 create mode 100644 src/algorithms/math/factorial/__test__/factorialRecursiveTCO.test.js

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);
+  });
+});