我最近在采访中遇到了这个问题
有n
楼梯,站在底部的人想要到达顶部。这个人一次可以爬1个楼梯或2个楼梯。
打印所有人可以到达顶部的方式。
例如,n=4
输出:
1 2 3 4
1 2 4
1 3 4
2 3 4
2 4
但我无法正确编码。如何为此编写解决方案?
答案 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()
这个想法是:
curr
是您当前的目标。n
是你需要去的最后一个楼梯。答案 1 :(得分:3)
您可以尝试一些递归解决方案,您可以递归调用git
和CanClimb(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