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
  • 276,994
  • 27
  • 311
  • 503
  • Do we need to prefix 1 and 2 to the solutions in each function call? I – a_sid Jan 03 '21 at 21:50
  • What do you think? What would make sense? – Yuval Filmus Jan 03 '21 at 21:51
  • I do NOT think it should happen in each function call. I think we should prefix 1 and 2 after we have returned to the ultimate/1st function call with all the values. – a_sid Jan 03 '21 at 21:54
  • Try it out and see what you get. – Yuval Filmus Jan 03 '21 at 21:54
  • Ok...We have to do the prefixing in each function call to get the correct answer. – a_sid Jan 04 '21 at 00:24
  • Apparently, to go from function 2 to function 2-1 for example, you are recursively calling the function with 2-1 as the parameter. The function with 2-1 in your case will return 1.The program returns back to 2 from 2-1. You now want to see the step it took to go to the 2-1 function. We know it took 1 step. Hence, we attach 1 to the 2-1 function's result which will give us the result 11. – a_sid Jan 04 '21 at 00:37
  • So we want to prefix 1 or 2 in each recursive function call because in each recursive function, we want to keep track of the steps we took to get to the subsequent step. For example, you are subtracting 1 to get from the current to the next step and once you come back to the current step, you are adding back 1 to show you had taken 1 step. – a_sid Jan 04 '21 at 00:45
  • Please let me know if my thinking is correct. – a_sid Jan 04 '21 at 00:48
  • 1
    Yes, that’s the idea. – Yuval Filmus Jan 04 '21 at 06:32
  • Could you please share your views on this question as well? – a_sid Jan 05 '21 at 23:07
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

  • 1
    Hello at COMPUTER SCIENCE @SE. Please state, in a single question sentence, what your post answers. Check if that sums up Maxfield's 2018 question. – greybeard Aug 03 '21 at 21:05