File tree Expand file tree Collapse file tree 2 files changed +74
-0
lines changed Expand file tree Collapse file tree 2 files changed +74
-0
lines changed Original file line number Diff line number Diff line change 1+ // Option 1
2+ export const fibonacci = ( n : number ) => {
3+ const result = [ 0 , 1 ] ;
4+
5+ for ( let i = 2 ; i <= n ; i ++ ) {
6+ const a = result [ i - 1 ] ;
7+ const b = result [ i - 2 ] ;
8+
9+ result . push ( a + b ) ;
10+ }
11+
12+ return result [ n ] ;
13+ } ;
14+
15+ const memoize = ( fn : ( n : number ) => number ) => {
16+ const cache : { [ key : string ] : number } = { } ;
17+
18+ return function ( ...args : number [ ] ) {
19+ const key = JSON . stringify ( args ) ;
20+
21+ if ( cache [ key ] ) {
22+ return cache [ key ] ;
23+ }
24+
25+ const result = fn . apply ( this , args ) ;
26+ cache [ key ] = result ;
27+
28+ return result ;
29+ } ;
30+ } ;
31+
32+ const slowFib = ( n : number ) => {
33+ if ( n < 2 ) {
34+ return n ;
35+ }
36+
37+ return memoizedFib ( n - 1 ) + memoizedFib ( n - 2 ) ;
38+ } ;
39+
40+ // Option 2
41+ export const memoizedFib = memoize ( slowFib ) ;
Original file line number Diff line number Diff line change 1+ import { fibonacci , memoizedFib } from '../fibonacci' ;
2+
3+ describe ( 'Fibonacci Algorithm' , ( ) => {
4+ test ( 'Fib function is defined' , ( ) => {
5+ expect ( typeof fibonacci ) . toEqual ( 'function' ) ;
6+ expect ( typeof memoizedFib ) . toEqual ( 'function' ) ;
7+ } ) ;
8+
9+ test ( 'calculates correct fibonacci value for 1' , ( ) => {
10+ expect ( fibonacci ( 1 ) ) . toEqual ( 1 ) ;
11+ expect ( memoizedFib ( 1 ) ) . toEqual ( 1 ) ;
12+ } ) ;
13+
14+ test ( 'calculates correct fibonacci value for 2' , ( ) => {
15+ expect ( fibonacci ( 2 ) ) . toEqual ( 1 ) ;
16+ expect ( memoizedFib ( 2 ) ) . toEqual ( 1 ) ;
17+ } ) ;
18+
19+ test ( 'calculates correct fibonacci value for 3' , ( ) => {
20+ expect ( fibonacci ( 3 ) ) . toEqual ( 2 ) ;
21+ expect ( memoizedFib ( 3 ) ) . toEqual ( 2 ) ;
22+ } ) ;
23+
24+ test ( 'calculates correct fibonacci value for 4' , ( ) => {
25+ expect ( fibonacci ( 4 ) ) . toEqual ( 3 ) ;
26+ expect ( memoizedFib ( 4 ) ) . toEqual ( 3 ) ;
27+ } ) ;
28+
29+ test ( 'calculates correct fibonacci value for 15' , ( ) => {
30+ expect ( fibonacci ( 39 ) ) . toEqual ( 63245986 ) ;
31+ expect ( memoizedFib ( 39 ) ) . toEqual ( 63245986 ) ;
32+ } ) ;
33+ } ) ;
You can’t perform that action at this time.
0 commit comments