diff --git a/Recursive/Josephus.js b/Recursive/Josephus.js
new file mode 100644
index 0000000000..ca26371e82
--- /dev/null
+++ b/Recursive/Josephus.js
@@ -0,0 +1,25 @@
+/**
+ * @function Josephus
+ * @description recursive implementation of the Josephus function.
+ * @param {Integer[]} collection - The integer array.
+ * @param {Integer} - The step size.
+ * @return {Integer} - The last integer in the list.
+ * @see [JosephusProblem](https://en.wikipedia.org/wiki/Josephus_problem)
+ * @example [1,2,3,4,5,6,7] with step 3 = 4
+ */
+
+const josephus = (collection, step) => {
+  // return null for invalid steps that are less than or equal to 0
+  if (step <= 0 || collection.length === 0) {
+    return null
+  }
+  if (collection.length === 1) {
+    return collection[0]
+  } else {
+    step = (step - 1) % collection.length
+    collection.splice(step, 1)
+    return josephus(collection, step + collection.length)
+  }
+}
+
+export { josephus }
diff --git a/Recursive/test/Josephus.test.js b/Recursive/test/Josephus.test.js
new file mode 100644
index 0000000000..b0950e7e16
--- /dev/null
+++ b/Recursive/test/Josephus.test.js
@@ -0,0 +1,40 @@
+import { josephus } from '../Josephus'
+
+describe('Josephus', () => {
+  const collection = [1, 2, 3, 4, 5, 6, 7]
+  const collection1 = [1]
+  const collection2 = []
+
+  it('should return 4 for step size of 3', () => {
+    const step = 3
+    expect(josephus([...collection], step)).toBe(4)
+  })
+
+  it('should return 4 for a step size of 10', () => {
+    const step = 10
+    expect(josephus([...collection], step)).toBe(4)
+  })
+
+  it('should return null for a step size of 0 as it is invalid', () => {
+    const step = 0
+    expect(josephus([...collection], step)).toBeNull()
+  })
+
+  it('should return 7 for a step size of 1000', () => {
+    const step = 1000
+    expect(josephus([...collection], step)).toBe(7)
+  })
+
+  it('should return null for a step size of -1 as it is invalid', () => {
+    const step = -1
+    expect(josephus([...collection], step)).toBeNull()
+  })
+  it('should return 1 for a collection with just 1', () => {
+    const step = 2
+    expect(josephus([...collection1], step)).toBe(1)
+  })
+  it('should return null for an empty collection as it is invalid', () => {
+    const step = 3
+    expect(josephus([...collection2], step)).toBeNull()
+  })
+})