打印到达第n个楼梯的方式

时间:2015-09-28 08:43:49

标签: algorithm data-structures dynamic-programming

我最近在采访中遇到了这个问题

n楼梯,站在底部的人想要到达顶部。这个人一次可以爬1个楼梯或2个楼梯。

打印所有人可以到达顶部的方式。

例如,n=4输出:

1 2 3 4
1 2 4
1 3 4
2 3 4
2 4

但我无法正确编码。如何为此编写解决方案?

2 个答案:

答案 0 :(得分:4)

要打印方式的数量,您可以先了解如何计算方式的数量,然后进行调整,以便打印每个“计数”而不是仅计数:

D(0) = 1
D(-1) = 0
D(i) = D(i-1) + D(i-2)

要将其调整为实际打印,您需要“记住”您所做的选择,并遵循相同的逻辑。伪代码:

printWays(curr, n, soFar):
   if curr > n: 
      return
   soFar.append(curr)
   if n == curr:
      print soFar
      soFar.removeLast()
      return
   printWays(curr+1,n,soFar)
   printWays(curr+2,n,soFar)
   soFar.removeLast()

这个想法是:

  • soFar是您当前执行的一系列步骤。
  • curr是您当前的目标。
  • n是你需要去的最后一个楼梯。
  • 在每个点上,你要么爬一两个楼梯。你检查两个选项。

答案 1 :(得分:3)

您可以尝试一些递归解决方案,您可以递归调用gitCanClimb(n-1)来查看可能的方法。

C#中的示例解决方案:

CanClimb(n-2)

public static void ClimbWays(int n, int currentIndex, int[] currectClimb) { if (n < 0) return; if (n == 0) { for (var i = currentIndex - 1; i >= 0; i--) { Console.Write(currectClimb[i] + " "); } Console.WriteLine(); return; } currectClimb[currentIndex] = n; ClimbWays(n - 1, currentIndex + 1, currectClimb); ClimbWays(n - 2, currentIndex + 1, currectClimb); } 的输出:

ClimbWays(4, 0, new int[4]);

如果你想计算它们,你可以使用众所周知的Fibonacci序列,它可以迭代计算:

1 2 3 4
2 3 4
1 3 4
1 2 4
2 4