在一个递归问题中,函数int stairs(int n)返回爬上n级楼梯的可能次数,条件是要么走1步,要么走2步。
下面的代码解决了这个问题:

int stairs(int n)
{
   if (n<0) return 0;
   if (n==0) return 1;
   return stairs(n-1) + stairs(n-2);
}

现在我有一个限制条件:如果你到了20楼,你必须使用电梯,它会自动把你一直带到N楼。如果由于某种原因你跳过了20层(例如,到19层,然后爬2层到21层),照常继续。
找到上面约束的可能数量。
到目前为止我所做的是:
int stairs20(int n)
{
    if (n<=20) return stairs(n);
    return stairs(20) + stairs(n-21);
}

代码背后的逻辑是计算到达20楼的可能性数量,以及从21楼及以上的可能性数量。
我想这并不能得到正确的答案,我希望你能告诉我,我的错误在哪里,或者我没有在计算什么?

最佳答案

n>20
你可以先到20楼,然后一直往上走。
你也可以到19楼,然后到21楼,从21楼,你有stairs(20)到n楼的路,所以=>stairs(n-21)
所以总结起来就是stairs(19)*stairs(n-21)
可以使用动态编程来避免计算相同的值。

07-26 09:30