【发布时间】:2015-12-25 10:54:14
【问题描述】:
我最近在面试中遇到了这个问题
有n楼梯,站在底部的人想爬到顶部。此人一次可以爬 1 个或 2 个楼梯。
打印所有可能的人可以到达顶部的方式。
例如n=4 输出:
1 2 3 4
1 2 4
1 3 4
2 3 4
2 4
但我无法正确编码。如何为此编写解决方案?
【问题讨论】:
标签: 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
但我无法正确编码。如何为此编写解决方案?
【问题讨论】:
标签: algorithm data-structures dynamic-programming
要打印路数,您可以先了解如何计算路数,并调整它,使每个“计数”都会打印,而不仅仅是计数:
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 是您需要到达的最后一个楼梯。【讨论】:
您可以尝试一些递归解决方案,递归调用 CanClimb(n-1) 和 CanClimb(n-2) 以可视化可能的方式。
C# 中的示例解决方案:
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]); 的输出:
1 2 3 4
2 3 4
1 3 4
1 2 4
2 4
如果您只想计算它们,您可以使用众所周知的斐波那契数列,该数列可以迭代计算:
public static int Fibonacci(int n)
{
int a = 0;
int b = 1;
// In N steps compute Fibonacci sequence iteratively.
for (int i = 0; i < n; i++)
{
int temp = a;
a = b;
b = temp + b;
}
return a;
}
【讨论】: