build(deps-dev): apply updates
[benchmarks-js.git] / fibonacci.js
CommitLineData
662a730a 1const Benchmark = require('benny')
a9c78d5d
JB
2
3const number = 30
4
5/**
6 * @param num
7fd91296 7 * @returns
a9c78d5d
JB
8 */
9function fibonacciLoop (num) {
b34f63ab
JB
10 const fib = []
11 fib[0] = 0
12 fib[1] = 1
13 for (let i = 2; i <= num; i++) {
14 fib[i] = fib[i - 2] + fib[i - 1]
a9c78d5d 15 }
b34f63ab 16 return fib[num]
a9c78d5d
JB
17}
18
19/**
20 * @param num
7fd91296 21 * @returns
a9c78d5d
JB
22 */
23function fibonacciRecursion (num) {
b34f63ab 24 if (num <= 1) return num
a9c78d5d
JB
25 return fibonacciRecursion(num - 1) + fibonacciRecursion(num - 2)
26}
27
28/**
29 * @param num
30 * @param memo
7fd91296 31 * @returns
a9c78d5d
JB
32 */
33function fibonacciRecursionMemoization (num, memo) {
34 memo = memo || {}
35
36 if (memo[num]) return memo[num]
b34f63ab 37 if (num <= 1) return num
a9c78d5d
JB
38
39 return (memo[num] =
40 fibonacciRecursionMemoization(num - 1, memo) +
41 fibonacciRecursionMemoization(num - 2, memo))
42}
43
662a730a 44Benchmark.suite(
bb578730 45 `Fibonacci number ${number}`,
662a730a 46 Benchmark.add('fibonacciLoop', () => {
a9c78d5d 47 fibonacciLoop(number)
662a730a
JB
48 }),
49 Benchmark.add('fibonacciRecursion', () => {
a9c78d5d 50 fibonacciRecursion(number)
662a730a
JB
51 }),
52 Benchmark.add('fibonacciRecursionMemoization', () => {
a9c78d5d 53 fibonacciRecursionMemoization(number)
662a730a
JB
54 }),
55 Benchmark.cycle(),
56 Benchmark.complete(),
57 Benchmark.save({ file: 'fibonacci', format: 'json', details: true }),
58 Benchmark.save({ file: 'fibonacci', format: 'chart.html', details: true }),
59 Benchmark.save({ file: 'fibonacci', format: 'table.html', details: true })
4b16770a
JB
60).catch(err => {
61 console.error(err)
62})