在20楼爬上n楼梯的可能性

时间:2014-12-17 11:22:03

标签: c recursion fibonacci

我解决了一个递归问题,其中函数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楼及以上的可能性数量。 我认为这不能找到正确的答案,并希望了解我的错误在哪里或者我不算什么?

2 个答案:

答案 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}}