Skip to content
79 changes: 62 additions & 17 deletions chapter08/8.01 - Triple Step/tripleStep.js
Original file line number Diff line number Diff line change
@@ -1,20 +1,65 @@
var numWays = function(N) {
var answer = 0;
var recurse = function(number) {
if (number === 0) {
answer++;
} else if (number > 0) {
recurse(number - 1);
recurse(number - 2);
recurse(number - 3);
}
};
recurse(N);
return answer;
};
/*
Recursion and Dynamic Programming (4 steps)
1. Start with the recursive backtracking solution (Brute Force)
2. Optimize by using a memoization table (top-down dynamic programming)
3. Remove the need for recursion (bottom-up dynamic programming)
4. Apply final tricks to reduce the time / memory complexity
*/

// Recursive BackTracking
// Time & Space O(n!)
var tripleStep = function(n, res=0) {
if (n < 0) return 0
if (n === 0) return 1
return tripleStep(n - 1) + tripleStep(n - 2) + tripleStep(n - 3)
}

// Top Down Memoization
// Time & Space O(n)
var tripleStep = function(n, i=3, memo = [1, 1, 2, 4]) {
if (n < 0) return memo[0]
if (n === 1) return memo[n]
if (i > n ) return memo[memo.length - 1]

memo[i] = memo[i - 1] + memo[i - 2] + memo[i - 3]
return tripleStep(n, i+1, memo)
}

// Bottom Up memoization
// Time & Space O(n)
var tripleStep = function(n, memo=[1,1,2,4]) {
for (let i = 3; i <= n; i++) {
memo[i] = memo[i - 1] + memo[i - 2] + memo[i - 3]
}

return memo[memo.length - 1]
}

// Constant Space
// Time O(n) & Space O(1)
var tripleStep = function(n) {
if (n <= 0) return 0
if (n === 1) return 1
if (n === 2) return 2

let a = 1
let b = 1
let c = 2

for (let i = 3; i < n; i++) {
let d = a + b + c
a = b
b = c
c = d
}
return a + b + c
}

/* TEST */
console.log(tripleStep(1), 1);
console.log(tripleStep(2), 2);
console.log(tripleStep(3), 4);
console.log(tripleStep(5), 13)
console.log(tripleStep(7), 44)
console.log(tripleStep(10), 274);

console.log(numWays(1), 1);
console.log(numWays(2), 2);
console.log(numWays(3), 4);