在一本书中,我遇到了以下问题:
考虑到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);
}
我在理解此代码时遇到以下问题:
我不明白为什么在n = 0时返回1。如果有0个步骤,那么显然我们不必攀爬任何0并且应该返回。
对于n = 3,函数返回4但我只能看到3种情况,即(1,1,1),(1,2),(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