2

I came across this classic question and found may many solution to it. for loop and DP/ reclusive + memorization.

Also found a twisted version of the questions asking to print all possible path instead of counting. Wondering for the twisted version, if we have DP solution ?
Q: If there are n stairs, you can either take 1 or 2 steps at a time, how may way can you finish the stairs. we can just using fib to calculate it. What if you are ask print out all possible ways(not revision please). For example, if n = 5. we have as solution. pseudo code is welcome.

[1, 1, 1, 1, 1]
[1, 1, 1, 2]
[1, 1, 2, 1]
[1, 2, 1, 1]
[1, 2, 2]
[2, 1, 1, 1]
[2, 1, 2]
[2, 2, 1] 
Maxfield
  • 227
  • 1
  • 7

2 Answers2

1

Here is pseudocode for solving this, using a recursive procedure:

All-Solutions($n$):

If $n=0$, return the solution (empty sequence).

If $n=1$, return the solution $1$.

Otherwise:

  1. Run All-Solutions($n-1$), and prefix $1$ to all results.

  2. Run All-Solutions($n-2$), and prefix $2$ to all results.


There is also a simple iterative solution. Start with the solution composed of $n$ many $1$s, and iteratively try to increase it, until getting stuck. How to increase a solution?

  • If a solution ends with $1,1$, replace this with $2$.
  • If a solution ends with $2,1$, consider the suffix of the form $1,2,\ldots,2,1$; if none exists, then the process terminates. If the suffix contains $\ell$ many $2$s, replace it with $2$ followed by $2\ell$ many $1$s.
  • If a solution ends with $2$, consider the suffix of the form $1,2,\ldots,2$; if none exists, then the process terminates. If the suffix contains $\ell$ many $2$s, replace it with $2$ followed by $2\ell-1$ many $1$s.

Here is an example, $n=5$: \begin{align} &1,1,1,1,1 \\ &1,1,1,2 \\ &1,1,2,1 \\ &1,2,1,1 \\ &1,2,2 \\ &2,1,1,1 \\ &2,1,2 \\ &2,2,1 \end{align}

Both solutions output the list in lexicographic order. The iterative one has $O(1)$ amortized update time. Indeed, the length of the list is $F_{n+1}$, and the total length of suffixes is $F_{n+3}-2$, and so the average length of a suffix is roughly $\phi^2 = \phi + 1 \approx 2.618$.

Yuval Filmus
  • 280,205
  • 27
  • 317
  • 514
0

I was thinking same so I solved with python but in my question there were three step constrain instead of 2

def paths(n):
    if n==0:
        empty = []
        empty.append('')
        return empty
    if n<0:
        empty = []
        return empty
paths1 = paths(n-1)
paths2 = paths(n-2)
paths3 = paths(n-3)

path = []
for i in paths1:
    path.append(i+'1')
for i in paths2:
    path.append(i+'2')
for i in paths3:
    path.append(i+'3')
return path