rob = (nums, i = 0, memo = initMemo(nums)) => {
    const isBaseCase = nums.length <= i;
    if (isBaseCase) return 0;

    const hasSeen = 0 <= memo[i];
    if (hasSeen) return memo[i];

    const [ next, nextNext ] = [ (i + 1), (i + 2) ];
    const right = nums[i];
    const mid = rob(nums, next, memo);     /* Time O(N) | Space O(N) */
    const left = rob(nums, nextNext, memo);/* Time O(N) | Space O(N) */
    const house = left + right;

    memo[i] = Math.max(mid, house);        /*           | Space O(N) */

    return memo[i];
}
DP - Top Down
Array - Memoization
Time O(N) | Space O(N)
https://leetcode.com/problems/house-robber/
@param {number[]} nums
@return {number}