Memoization of recursive calls on separate lines

I am attempting to solve Leetcode problem 70 by first trying to visualize the tree and then implement the solution. The tree is simple in that the left branch is a single step and the second branch is a double step.

For n = 3, the tree would be;

      /  
     /    
    1      2
   /     /
  1   2  1
 /
1

Giving 1,1,1, 1,2 and 2,1 for a total of 3. I came up with a non-memoized solution which uses two recursive ‘branch’ calls

var climbStairs = function(n) {
  let dfs = (combination) => {
    let steps = combination.reduce((prev, curr) => prev + curr, 0)

    if (steps === n) {
      output.push(combination)
      return
    }

    if (steps > n) {
      return
    }

    dfs([...combination, 1])
    dfs([...combination, 2])
  }

  let output = []
  dfs([])
  return output.length
};

This works, but times out for larger numbers as expected. So I have two questions;

  1. Is it possible to have a memoized version of my attempt above? (i.e. when the recursive branch calls are on separate lines)

  2. All other solutions on the site use a variation of fibonacci; dfs(step + 1) + dfs(step + 2). I don’t quite understand why the two recursive calls should be added in this example problem. What is the ‘give away’ that adding the two recursive calls is the way to go rather than branching on different lines?