diff --git a/Maths/Fibonacci.js b/Maths/Fibonacci.js index fc8102ad2..998c75302 100644 --- a/Maths/Fibonacci.js +++ b/Maths/Fibonacci.js @@ -187,9 +187,20 @@ const FibonacciMatrixExpo = (num) => { return F[0][0] * (isNeg ? (-ONE) ** (num + ONE) : ONE) } +/* + Resource : https://math.hmc.edu/funfacts/fibonacci-number-formula/ +*/ + +const sqrt5 = Math.sqrt(5) +const phi = (1 + sqrt5) / 2 +const psi = (1 - sqrt5) / 2 + +const FibonacciUsingFormula = n => Math.round((phi ** n - psi ** n) / sqrt5) + export { FibonacciDpWithoutRecursion } export { FibonacciIterative } export { FibonacciGenerator } export { FibonacciRecursive } export { FibonacciRecursiveDP } export { FibonacciMatrixExpo } +export { FibonacciUsingFormula } diff --git a/Maths/test/Fibonacci.test.js b/Maths/test/Fibonacci.test.js index f3dcb98fe..f91aef73d 100644 --- a/Maths/test/Fibonacci.test.js +++ b/Maths/test/Fibonacci.test.js @@ -4,7 +4,8 @@ import { FibonacciIterative, FibonacciGenerator, FibonacciRecursive, - FibonacciMatrixExpo + FibonacciMatrixExpo, + FibonacciUsingFormula } from '../Fibonacci' describe('Fibonacci', () => { @@ -95,4 +96,11 @@ describe('Fibonacci', () => { expect(FibonacciMatrixExpo(-5n)).toBe(5n) expect(FibonacciMatrixExpo(-6n)).toBe(-8n) }) + it.each([ + [0, 0], + [1, 1], + [15, 610] + ])('should calculate the correct Fibonacci number for n = %i', (n, expected) => { + expect(FibonacciUsingFormula(n)).toBe(expected) + }) })