“小明爬楼梯”问题

问题来源

可爱的小明特别喜欢爬楼梯,他有的时候一次爬一个台阶,有的时候一次爬两个台阶,有的时候一次爬三个台阶。如果这个楼梯有36个台阶,小明一共有多少种爬法呢?

这是典型的递归问题:小明爬到第36个台阶,可以从第35个台阶再爬1阶上去;可以从第34个台阶再爬2阶上去,也可以从第33个台阶再爬3阶上去——所以,他爬36阶可选择的爬法的数目相当于,爬35、34、33阶可选择的爬法的总数目,而爬35、34、33阶各自可选择的爬法的数目,又可以像这样计算,直到回到最简单的爬3、2、1阶可选择的爬法的数目(依次是4种、2种和1种)。

于是我们得到答案:小明这样爬36个台阶,一共有2082876103种爬法。

下面是解决该问题的一份C程序代码:

#include<stdio.h>
int f(int n){
    switch(n){
        case 1:
            return 1;
        case 2:
            return 2;
        case 3:
            return 4;
        default:
            return f(n-1)+f(n-2)+f(n-3);
    }
}
int main(){
    printf("%d\n",f(36));
    return 0;
}

它虽然很直观,但速度却比较慢。

于是再提供一份相对复杂,但更快的C程序代码:

#include<stdio.h>
long f(int n){
    n++;
    int i;
    long table[n];
    for(i=0;i<n;i++){
        table[i]=0;
    }
    table[1]=1;
    table[2]=2;
    table[3]=4;
    for(i=4;i<n;i++){
        table[i]=table[i-1]+table[i-2]+table[i-3];
    }
    return table[n-1];
}
int main(){
    printf("%d\n",f(36));
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 硬派健身 摘要 自序 与更好的自己,在未来重逢。 2016-10-11 13:34:10 是谁说运动一定要持续40...
    夜上海滩阅读 10,090评论 0 50
  • 家有三姐一枚,懂头发懂衣服懂化妆,只是不太懂做饭。去年来京后,不太懂做饭的三姐,碰到了这个真的不懂做饭的我,于...
    饕餮宝贝阅读 206评论 0 0
  • 遇见·陪伴·选择 我不知道接下来还会有怎样的主题,但我知道每一期我都有幸能找到某种共鸣~ 每一期节目都有泪目的时候...
    一根蓝色骨头阅读 218评论 0 0
  • 文/风中的柳絮 一、主题中心(也就是树杆)必须先明确。 1、设计一件事件发生,围绕此事进行一系列展开。 切入点:可...
    我家大坏蛋阅读 483评论 0 3
  • 我搬到满天星生活已经有半个月了,刚来时是三月初,还有些冷,这几天明显气温变暖,前两天还看到路边的小草冒出了头,...
    烟然s阅读 456评论 3 5