From cb9a1bc215923de33164b72a2248e164016f16cb Mon Sep 17 00:00:00 2001 From: Francis Lagares Date: Tue, 22 Aug 2023 17:20:04 +0200 Subject: [PATCH] feat: fibonacci algorithm --- src/algorithms/fibonacci/fibonacci.ts | 41 +++++++++++++++++++ .../fibonacci/tests/fibonacci.test.ts | 33 +++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 src/algorithms/fibonacci/fibonacci.ts create mode 100644 src/algorithms/fibonacci/tests/fibonacci.test.ts diff --git a/src/algorithms/fibonacci/fibonacci.ts b/src/algorithms/fibonacci/fibonacci.ts new file mode 100644 index 0000000..280a598 --- /dev/null +++ b/src/algorithms/fibonacci/fibonacci.ts @@ -0,0 +1,41 @@ +// Option 1 +export const fibonacci = (n: number) => { + const result = [0, 1]; + + for (let i = 2; i <= n; i++) { + const a = result[i - 1]; + const b = result[i - 2]; + + result.push(a + b); + } + + return result[n]; +}; + +const memoize = (fn: (n: number) => number) => { + const cache: { [key: string]: number } = {}; + + return function (...args: number[]) { + const key = JSON.stringify(args); + + if (cache[key]) { + return cache[key]; + } + + const result = fn.apply(this, args); + cache[key] = result; + + return result; + }; +}; + +const slowFib = (n: number) => { + if (n < 2) { + return n; + } + + return memoizedFib(n - 1) + memoizedFib(n - 2); +}; + +// Option 2 +export const memoizedFib = memoize(slowFib); diff --git a/src/algorithms/fibonacci/tests/fibonacci.test.ts b/src/algorithms/fibonacci/tests/fibonacci.test.ts new file mode 100644 index 0000000..e02f0df --- /dev/null +++ b/src/algorithms/fibonacci/tests/fibonacci.test.ts @@ -0,0 +1,33 @@ +import { fibonacci, memoizedFib } from '../fibonacci'; + +describe('Fibonacci Algorithm', () => { + test('Fib function is defined', () => { + expect(typeof fibonacci).toEqual('function'); + expect(typeof memoizedFib).toEqual('function'); + }); + + test('calculates correct fibonacci value for 1', () => { + expect(fibonacci(1)).toEqual(1); + expect(memoizedFib(1)).toEqual(1); + }); + + test('calculates correct fibonacci value for 2', () => { + expect(fibonacci(2)).toEqual(1); + expect(memoizedFib(2)).toEqual(1); + }); + + test('calculates correct fibonacci value for 3', () => { + expect(fibonacci(3)).toEqual(2); + expect(memoizedFib(3)).toEqual(2); + }); + + test('calculates correct fibonacci value for 4', () => { + expect(fibonacci(4)).toEqual(3); + expect(memoizedFib(4)).toEqual(3); + }); + + test('calculates correct fibonacci value for 15', () => { + expect(fibonacci(39)).toEqual(63245986); + expect(memoizedFib(39)).toEqual(63245986); + }); +});