计算采用1,2或3步骤攀爬n步的方法

时间:2013-03-10 02:08:17

标签: algorithm recursion dynamic-programming

在一本书中,我遇到了以下问题:

考虑到N步台阶,如果一次使用1,2或3步,你可以攀爬多少种方式?

以下是本书给出的代码:

 int countWays(int n){

    if(n<0)
        return 0;

    if(n == 0)
        return 1;

    else return countWays(n-1) + countWays(n-2) + countWays(n-3);
  }

我在理解此代码时遇到以下问题:

  1. 我不明白为什么在n = 0时返回1。如果有0个步骤,那么显然我们不必攀爬任何0并且应该返回。

  2. 对于n = 3,函数返回4但我只能看到3种情况,即(1,1,1),(1,2),(3)。

3 个答案:

答案 0 :(得分:2)

  

我不明白为什么在n = 0时返回1。如果有0   那么步骤显然我们不必攀爬任何0应该是   返回。

当没有任何步骤时,你只需要经过攀登,这是唯一的一种方式。正如其中一条评论所指出的那样,它可以表示为()

  

对于n = 3,函数返回4,但我只能看到3个案例,即(1,1,1),   (1,2),(3)。

实际上有4种情况:(1,1,1),(1,2),(2,1),(3)。

答案 1 :(得分:0)

正如Geobits所说,爬楼梯有四种方法

(1,1,1),(1,2),(2,1),(3)

至于为什么它在n==0时返回1,这是因为每当n==0表示您找到了完全一种爬楼梯的方式时。

最后,如果您输入任何高数字,此算法将花费很长时间,如果您正在寻找动态编程方法,则应创建n大小的数组并将前三个条目初始化为{{1然后遍历数组start和index 3,每次将索引设置为1,2,4。这将进行最少量的计算,但会占用大量内存。

有一种更好的方法,你只使用一个1x3大小的数组,但我会留下如何做这个为用户练习。

答案 2 :(得分:0)

  

我不明白为什么在n = 0时返回1。如果有0个步骤,那么显然我们不必攀爬任何0并且应该返回。

为了补充answer by Terry,问题的一般答案是tribonacci(n+2)序列。因此,对于n=0,即tribonacci(2),值为1.这只是楼梯问题的计算黑客,其中一个有效。如需更全面的调查,请参阅this answer

您当然可以选择拒绝f(n=0) = 1。如果您这样做,那么您可以使用以下基本案例值,您将更加熟悉它们。所有n>3都将被递归到这些基本案例。

  • f(n=1) = 1
  • f(n=2) = 2
  • f(n=3) = 4