再见“小明爬楼梯”问题

在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型数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/381979.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uva 10539——Almost Prime Numbers

题意&#xff1a;给定一个区间范围&#xff0c;然后问在这个范围之内有多少个数是素数的整数倍&#xff0c;就是能够化成一个素数乘方的形式思路&#xff1a;首先要打一张sqrt&#xff08;N5)大小的素数表&#xff0c;然后对在在这个区间的数依次进行枚举做因数分解&#xff0c…

linux下隐藏输入密码

在做课设时&#xff0c;因为在windows上写了一个输入密码时屏幕显示为***的函数&#xff0c;但是在移植到linux系统上时却有问题&#xff0c;提示有错误。 上网搜索&#xff0c;有人说getch()函数的头文件是curses.h,还有人说是conio.h, 但是在ubuntu系统中都不能使用&#xf…

uva 11105——Semi-prime H-numbers

题意&#xff1a;定义了一种H素数&#xff0c;改素数的定义是能够被4整除余数为1&#xff0c;然后给定一个n值&#xff0c;问1到n中有多少个只被分解成两个H素数的数&#xff0c;题目很绕&#xff0c;H素数和他要球的东西一直搞不明白&#xff01;思路&#xff1a;最好的办法是…

文件操作总结(一)

该部分将作为日常学习的总结&#xff0c;内容将会比较杂乱&#xff0c;只有整体上的主题——文件操作。 主要目录的存储内容 /bin 全称binary&#xff0c; 存放普通用户可执行的命令/boot 存放Linux内核及开机启动的相关文件/etc 存放系统的配置文件/usr 存放系统应用程序及相…

uva 294 ——Divisors

题意&#xff1a;给定一个区间[l,r],然后问在该区间内谁的因子最多&#xff01;思路&#xff1a;先大致分析一下&#xff0c;比如对于一个数12&#xff0c;那么可以拆分成2*2*3&#xff0c;就是对一个数分解质因数&#xff0c;然后你会发现在组成因子的时候&#xff0c;每个质因…

邮箱验证 ——ACM

邮箱验证POJ 注册的时候需要用户输入邮箱&#xff0c;验证邮箱的规则包括&#xff1a; 1)有且仅有一个符号 2)和.不能出现在字符串的首和尾 3)之后至少要有一个.&#xff0c;并且不能和.直接相连 满足以上3条的字符串为合法邮箱&#xff0c;否则不合法&#xff0c; 编写程…

uva 10140——Prime Distance

题意&#xff1a;题目出的很简单&#xff0c;给定一个数据范围&#xff08;好吧&#xff0c;又是给定一个范围&#xff09;&#xff0c;然后问你在这个给定的范围内&#xff0c;哪两个相邻素数挨的最近&#xff0c;哪两个最远。思路&#xff1a;这破题数据量很大&#xff0c;如…

Lowest Common Multiple Plus ——ACM

1. Lowest Common Multiple Plus求n个数的最小公倍数。Input 输入包含多个测试实例&#xff0c;每个测试实例的开始是一个正整数n&#xff0c;然后是n个正整数。为每组测试数据输出它们的最小公倍数&#xff0c;每个测试实例的输出占一行。你可以假设最后的输出是一个32位的整…

文件操作(二) 其他总结

一、 文件操作 1、 获取文件属性 #include<sys/types.h> #include<sys/stat.h> #include<unistd.h>int stat(const char *filename, struct stat *buf); int fstat(int fd, struct stat *buf); int lstat(const char *filename, struct stat *buf);部分常用…

【转】博弈知识汇总

有一种很有意思的游戏&#xff0c;就是有物体若干堆&#xff0c;可以是火柴棍或是围棋子等等均可。两个人轮流从堆中取物体若干&#xff0c;规定最后取光物体者取胜。这是我国民间很古老的一个游戏&#xff0c;别看这游戏极其简单&#xff0c;却蕴含着深刻的数学原理。下面我们…

搞ACM的你伤不起(转)

笑喷了。。。。。。。。。劳资六年前开始搞ACM啊&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 从此踏上了尼玛不归路啊&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#x…

学计算机的你伤不起啊(转)

学计算机的你伤不起啊&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 老子六年前开始学计算机啊&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;于是踏上了尼玛不归路啊&#xff01;&#xff01;&#xff01;&#xff…

进程控制 (二) Others

1. 执行新程序 只列出几个常用的函数&#xff1a; #include <unistd.h> int execve(const char *path, char * const argv[], char * const envp[]);//envp[]为环境变量&#xff0c;可直接调用int execv(const char *path, char * const argv[]);//与execve&#xff08…

【转载】ACM中矩阵乘法的应用

copied from 大神s blog 不要以为数学中的矩阵也是黑色屏幕上不断变化的绿色字符。在数学中&#xff0c;一个矩阵说穿了就是一个二维数组。一个n行m列的矩阵可以乘以一个m行p列的矩阵&#xff0c;得到的结果是一个n行p列的矩阵&#xff0c;其中的第i行第j列位置上的数等于前一…

线程控制(一)

1. 线程执行顺序问题 #include <stdio.h> #include <string.h> #include <pthread.h> #include <stdlib.h> #include <unistd.h>void *thread1(void *); void *thread2(void *);pthread_key_t key;void *thread1(void *arg){int a 1, *tsd &a…

Codeforces Round #324 (Div. 2) B. Kolya and Tanya

思路&#xff1a;因为题目说只要存在组ai??ai??n??ai??2n?≠?6就令人满意&#xff0c;也就是不满意的情况就是所有ai??ai??n??ai??2n?都等于6那就用所有的情况减去不满意的情况&#xff0c;总结: 直接用二分幂不知道为什么wa的要死&#xff0c;看到别人的题…

拓扑排序的题目集合

【HDU】1285确定比赛名次2094产生冠军2647Reward3342Legal or Not1811Rank of Tetris 拓扑并查集3231 Box Relations 三维拓扑【POJ】1094 Sorting It All Out Floyd拓扑2367 Genealogical tree3660 Cow Contest3687 Labeling Balls 神奇的拓扑1128Frame Stacking DFS版拓扑…

edward_mj退役经验帖

考完试了&#xff0c;也是时候补上退役帖了。考虑了一阵要怎么写&#xff0c;鉴于本文的目的主要是希望给后来的校队成员或者想参加这个竞赛的同学一个借鉴&#xff0c;最后还是决定用Q&A的形式。打ACM/ICPC有什么好处我觉得确切而言应该问把时间花在这上面有什么好处。提升…

C++学习笔记(一)

本文主要内容为C下的输入输出函数以及for循环中的C11新特性。 一、输入输出函数 1. cin cin 遇到 空格、回车、Tab结束输入&#xff0c; 且会将读到的空格、回车、Tab 丢弃&#xff0c;例&#xff1a; #include<iostream> using namespace std;int main(void) {char a…

为了更好——关于博客搬迁的说明

一开始没准备在网易安家的&#xff0c;可是由于博客和邮箱都在此处&#xff0c;访问会更加方便&#xff08;所以就稀里糊涂在这里安了家&#xff09;&#xff0c;但是后来发现网易的博客对用户并不友好&#xff08;广告低栏的注册&#xff09;&#xff0c;寻寻觅觅找了很多博客…