在c语言期末考试中,再次见到了“小明爬楼梯”问题,而第一次见到是在某次面试题中,由于当时还没有学到递归部分,因此就仅仅把代码看了一下,然而其中包含的思想却没有弄清楚,因此在考试时见到该题一头雾水,因此总结一下,以绝后患。

先上题:


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


该题为典型的递归问题,解决的思想当然就要不按常理出牌:
假设当前共有36阶台阶,小明若想到达第36阶台阶,只能选择从第35阶再上1阶,或从第34阶再上2阶,或从第33阶再上3阶,因此要想到达第36阶台阶,需要走的步数为到达之前3级台阶需要的步数之和,即f(n) = f(n-1) + f(n-2) + f(n-3).

示例代码:
 #include <stdio.h>int f(int n){if(n == 1)return 1;if(n == 2)return 2;if(n == 3)return 4;return f(n-1) + f(n-2) + f(n-3);}int main (void){int n;printf("请输入台阶数:\n");scanf("%d", &n);printf("所需步数为:%d\n", f(n));return 0;}

到这里就结束了吗?没有!!!虽然用递归做很直观,但是递归却造成了运行速度相对而言是极慢的,因此再附上一份稍微复杂那么一丢丢但是运行速度快的代码:

#include<stdio.h>
int f(int n){n++;int i;int table[n];  //存储台阶数为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(){int n;printf("请输入台阶数:\n");scanf("%d", &n);printf("%d\n",f(n));return 0;
}

注:本题应考虑数字范围的问题,由于考试时只有几组简单的测试数据,因此仅仅使用了int型数据,未使用long long型数据。

再见“小明爬楼梯”问题相关推荐

  1. 尾递归优化原理与Python实现(以Fibonacci数列和小明爬楼梯问题为例)

    首先祝全体屋友中秋节快乐! 众所周知,在函数递归调用时,要保存函数调用的位置以便使得被调函数结束后能够返回正确的位置,这个信息保存在线程栈中.由于栈的空间有限,所以如果函数递归调用深度超过一定限制,会 ...

  2. 小明爬楼梯--python

    '''题目:一共有15台阶,小明每次可以爬一节,或者两节,或者三阶. 思路: 第一种 如果把她用数学语言符号化1阶台阶分解成1,意味着只有一种方法:2可以分解成2和1 1意味着二阶台阶有两种算法.3可 ...

  3. 【Python】【小明爬楼梯】

    假设一段楼梯共15 个台阶,小明一步最多能上3个台阶.编写程序计算小明上这段楼梯一共有多少种方法.要求给出递推法和递归法两种代码. def climbStairs(n):first3={1:1,2:2 ...

  4. python小明爬楼梯_爬楼梯(Python and C++解法)

    题目: 假设你正在爬楼梯.需要 n 阶你才能到达楼顶.每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数.

  5. python小明爬楼梯_LintCode Python 简单级题目 111.爬楼梯 (斐波纳契数列 青蛙跳)

    **设f(n)为n阶台阶的情况下,所有不同的跳法方法的总和!** 1.如果起始跳一阶的话,剩余的n-1阶就有 f(n-1) 种跳法: 2.如果起始跳二阶的话,剩余的n-2阶就有 f(n-2) 种跳法: ...

  6. 【GZOJ】1369——小明跳楼梯

    题目链接:广大OJ1369 本题亦为广大15级第一次周赛的B题. 题目内容 Problem Description 小明很喜欢跳楼梯. 他可以一次跳一阶楼梯(记为1),也可以一次跳两个台阶(记为2). ...

  7. BM64-最小花费爬楼梯

    题目 给定一个整数数组 cost,其中 cost[i] 是从楼梯第i个台阶向上爬需要支付的费用,下标从0开始.一旦你支付此费用,即可选择向上爬一个或者两个台阶. 你可以选择从下标为 0 或下标为 1 ...

  8. [小明爬坑系列]AssetBundle原理介绍

    一.简介 Assetbundle 是Unity Pro提供提供的功能,它可以把多个游戏对象或者资源二进制文件封装到Assetbundle中,提供了封装与解包的方法使用起来很便利. 二.移动平台特点 A ...

  9. 746. 使用zui小花费爬楼梯(JavaScript)

    var minCostClimbingStairs = function(cost) {//初始化,i为第i个阶梯,dp[i]为花费的总体力let dp=[]dp[0]=cost[0]dp[1]=co ...

最新文章

  1. JavaScript如何声明对象、函数以及对象中的函数(即方法)
  2. CSS手写代码总结02
  3. 曾经迷茫的起点,多年后终于明白了(续)
  4. 深入理解定时器系列第二篇——被誉为神器的requestAnimationFrame
  5. 如何在Swift中掌握协议
  6. 论文公式编号右对齐_毕业论文详细排版,看这一篇就够了!
  7. 德阳计算机办公培训,德阳2017计算机办公软件培训
  8. c语言三角函数精度不够,快速三角函数算法的误差控制(sin cos)
  9. dht11 java_树莓派使用DHT11温湿度传感器
  10. 5 款非常好用的AI在线图片处理工具
  11. 学长的白日梦C语言题目,bzoj4030【HEOI2015】小L的白日梦
  12. a possible low-level optimization
  13. 互联网日报 | 小米市值突破6600亿港元;水滴筹上线“水滴行者”风控系统;2020世界互联网大会开幕...
  14. poi在word输出复选框windows远程突然不能复制的解决方法
  15. Python爬虫---爬取腾讯动漫全站漫画
  16. 将计算机移动到桌面,如何将图标移动到桌面 移动桌面图标的方法分享
  17. 欲报从速,已有56所高校选择云创大学高质量免费直播授课!
  18. 关于图像显著性(MR)matlab代码详解
  19. 读《哈佛情商课》有感
  20. .jar!/BOOT-INF/classes!/ jar包无法重启了,求大神帮忙解答,谢谢!

热门文章

  1. Android IPC机制(五)用Socket实现跨进程聊天程序
  2. C# -- 多线程向同一文件写入
  3. java.lang.Error: Unresolved compilation problems
  4. AlvinZH双掉坑里了
  5. 搭建springboot环境
  6. HDU 5652 India and China Origins(二分 + BFS)
  7. WPF笔记(1.1 WPF基础)——Hello,WPF!
  8. C++ new/new operator、operator new、placement new初识
  9. 给ULWOW 写的广告效果(缓动切换)
  10. apache gobblin mysql_gobblin简单使用