Fibonacci Number
· 2 min read
The Fibonacci numbers, commonly denoted F(n) form a sequence, called the Fibonacci sequence, such that each number is the sum of the two preceding ones, starting from 0 and 1. That is,
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), for N > 1.
Given N, calculate F(N).
Approach 1: recursive
- Time complexity : O(2^N)
- Space complexity : O(N)
var fib = function (N) {
if (N === 0) return 0;
if (N === 1) return 1;
return fib(N - 1) + fib(N - 2);
};
Approach 2: recursive with memozition
- Time complexity : O(N)
- Space complexity : O(N)
function fibonacci(n) {
if (n === 1) return 1;
if (n === 0) return 0;
const memo = {};
memo[n] = memo[n] || fibonacci(n - 1) + fibonacci(n - 2);
return memo[n];
}
// or
function memoize(fn) {
const memorizedMap = new Map();
return function (n) {
if (!memorizedMap.has(n)) {
memorizedMap.set(n, fn(n));
}
return memorizedMap.get(n);
};
}
function fib(n) {
if (n === 0) return 0;
if (n === 1) return 1;
return fib(n - 1) + fib(n - 2);
}
let memoizedFib = memoize(fib);
Approach 3: iterative(DP)
- Time complexity : O(N)
- Space complexity : O(N)
var fib = function (N) {
const tab = {
0: 0,
1: 1,
};
for (var i = 2; i <= N; i++) {
tab[i] = tab[i - 1] + tab[i - 2];
}
return tab[N];
};
//or
function fibonacciDP(n) {
const arr = Array(n);
arr[0] = 1;
arr[1] = 1;
for (let i = 2; i < n; i++) {
arr[i] = arr[i - 1] + arr[i - 2];
}
return arr[n - 1];
}
Approach 3: iterative(DP), make space complexity to O(1)
- Time complexity : O(N)
- Space complexity : O(1)
var fib = function (N) {
if (N <= 1) {
return N;
}
let current;
let pre1 = 0;
let pre2 = 1;
for (var i = 2; i <= N; i++) {
//[pre2, pre1] = [pre1+pre2, pre2]
current = pre1 + pre2;
pre1 = pre2;
pre2 = current;
}
return current;
};