【问题标题】:Print ways to reach the n’th stair打印到达第 n 个楼梯的方法
【发布时间】: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


【解决方案1】:

要打印路数,您可以先了解如何计算路数,并调整它,使每个“计数”都会打印,而不仅仅是计数:

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 是您需要到达的最后一个楼梯。
  • 在每一点,你要么爬上一两个楼梯。你检查这两个选项。

【讨论】:

    【解决方案2】:

    您可以尝试一些递归解决方案,递归调用 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-24
      • 1970-01-01
      • 1970-01-01
      • 2019-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多