From bc8e86ad2ce342f05bd48184084e0e7b0f63b5d6 Mon Sep 17 00:00:00 2001 From: Fahim Faisaal Date: Sat, 19 Feb 2022 18:56:17 +0600 Subject: [PATCH 1/4] docs: update js doc --- Dynamic-Programming/FibonacciNumber.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dynamic-Programming/FibonacciNumber.js b/Dynamic-Programming/FibonacciNumber.js index 96a3d5a342..861acd6ea0 100644 --- a/Dynamic-Programming/FibonacciNumber.js +++ b/Dynamic-Programming/FibonacciNumber.js @@ -1,5 +1,5 @@ /** - * @function Fibonacci + * @function fibonacci * @description Fibonacci is the sum of previous two fibonacci numbers. * @param {Integer} N - The input integer * @return {Integer} fibonacci of N. From 0fdd4740528830026b95a4b35e6015ae202194c2 Mon Sep 17 00:00:00 2001 From: Fahim Faisaal Date: Sat, 19 Feb 2022 18:57:55 +0600 Subject: [PATCH 2/4] feat: add number type validation condition --- Dynamic-Programming/FibonacciNumber.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Dynamic-Programming/FibonacciNumber.js b/Dynamic-Programming/FibonacciNumber.js index 861acd6ea0..aa0d7d11b2 100644 --- a/Dynamic-Programming/FibonacciNumber.js +++ b/Dynamic-Programming/FibonacciNumber.js @@ -6,6 +6,10 @@ * @see [Fibonacci_Numbers](https://en.wikipedia.org/wiki/Fibonacci_number) */ const fibonacci = (N) => { + if (!Number.isInteger(N)) { + throw new TypeError('Input should be integer') + } + // creating array to store values const memo = new Array(N + 1) memo[0] = 0 From af277b812be10172a43a5dad628960d619cb1eb5 Mon Sep 17 00:00:00 2001 From: Fahim Faisaal Date: Mon, 21 Feb 2022 21:08:44 +0600 Subject: [PATCH 3/4] pref: Optimize space complexity remove the Array from the algo and used two flag varible to calculate last two numbers & optimize the sapce complexity O(n) to O(1) --- Dynamic-Programming/FibonacciNumber.js | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/Dynamic-Programming/FibonacciNumber.js b/Dynamic-Programming/FibonacciNumber.js index aa0d7d11b2..6c389ca121 100644 --- a/Dynamic-Programming/FibonacciNumber.js +++ b/Dynamic-Programming/FibonacciNumber.js @@ -9,15 +9,19 @@ const fibonacci = (N) => { if (!Number.isInteger(N)) { throw new TypeError('Input should be integer') } - - // creating array to store values - const memo = new Array(N + 1) - memo[0] = 0 - memo[1] = 1 - for (let i = 2; i <= N; i++) { - memo[i] = memo[i - 1] + memo[i - 2] + + // memoize the last two numbers + let firstNumber = 0 + let secondNumber = 1 + + for (let i = 1; i < N; i++) { + const sumOfNumbers = firstNumber + secondNumber + // update last two numbers + firstNumber = secondNumber + secondNumber = sumOfNumbers } - return memo[N] + + return N ? secondNumber : firstNumber } export { fibonacci } From c1c05bda87914b0f1b82ed4ea76f6dbad5d1ddcd Mon Sep 17 00:00:00 2001 From: Fahim Faisaal Date: Tue, 22 Feb 2022 06:53:04 +0600 Subject: [PATCH 4/4] test: add test case for invalid types --- Dynamic-Programming/tests/FibonacciNumber.test.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Dynamic-Programming/tests/FibonacciNumber.test.js b/Dynamic-Programming/tests/FibonacciNumber.test.js index 03a89587a4..0b2da2dfe3 100644 --- a/Dynamic-Programming/tests/FibonacciNumber.test.js +++ b/Dynamic-Programming/tests/FibonacciNumber.test.js @@ -1,6 +1,12 @@ import { fibonacci } from '../FibonacciNumber' -describe('FibonacciNumber', () => { +describe('Testing FibonacciNumber', () => { + it('Testing for invalid type', () => { + expect(() => fibonacci('0')).toThrowError() + expect(() => fibonacci('12')).toThrowError() + expect(() => fibonacci(true)).toThrowError() + }) + it('fibonacci of 0', () => { expect(fibonacci(0)).toBe(0) })