我解决了一个递归问题,其中函数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楼及以上的可能性数量。 我认为这不能找到正确的答案,并希望了解我的错误在哪里或者我不算什么?
答案 0 :(得分:5)
n>20
时,
你可以先到达20楼,然后一路向上=&gt; stairs(20)
你也可以到达19楼,然后从21楼到21楼,你有stairs(n-21)
个楼层n,所以=&gt; stairs(19)*stairs(n-21)
总结为stairs(20) + stairs(19) * stairs(n-21)
。
您可以使用动态编程来避免计算相同的值。
答案 1 :(得分:2)
基本递归方案如下
int stairs(unsigned int n) {
if (n < 2)
return 1;
return stairs(n-1) + stairs(n-2);
}
现在,您必须问自己的问题是应用于阶梯20的规则将如何修改递归方案?如果n > 20
,则stairs(n)
将等于stairs(20) + <number_of_ways_to_climb_to_n_without_reaching_floor20)
。你怎么避免20楼?到达楼层19并直接到21楼。然后,在21楼,你必须爬到你到达楼层n。
因此stairs(19)*stairs(n-21)
可以n
到达楼层int stairs20(unsigned int n) {
if(n > 20) {
return stairs(20) + stairs(19)*stairs(n-21);
} else {
return stairs(n);
}
}
而不会在20楼停留。
因此,最终答案是:
{{1}}