在一个递归问题中,函数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)
。
可以使用动态编程来避免计算相同的值。