跳台阶问题
来源:互联网 发布:微软 azure认证 知乎 编辑:程序博客网 时间:2024/06/03 22:58
题目:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。求总共有多少总跳法,并分析算法的时间复杂度。
在这里看到这道面试题,思路是:
1)每次可以跳1级,也可以跳2级,如果当前只有1级台阶,那么就只有一次跳法;如果当前只有2级台阶,就有2种跳法(一种是每次跳1级,跳2次;另一种是一次跳2级,就跳完),也即 f(1) = 1; f(2) = 2。
2)假设有n级台阶要跳,如果最后一步是跳1级,那么剩下的就只有前面的n-1级台阶的步数了;如果最后一步是跳2级,那么剩下的就是前面n-2级台阶的步数了。总结两种情况,得出状态转移方程:
f(n) = f(n-1) + f(n-2)。
经过上面的过程,可以写出这样的代码:
int jumpstep(int n){ if(n == 1 || n == 2) return n; else return jumpstep(n-1) + jumpstep(n-2);}代码行数很少了,但是效率很低,因为有很多重复计算,于是,想出了另一个:
int jumpstep2(int n){ if(n == 1 || n ==2) return n; int *a = new int[n+1]; a[1] = 1; a[2] = 2; for(int i = 3; i <= n ; ++i){ a[i] = a[i-1] + a[i-2]; } int ret = a[n]; delete []a; return ret;}用一个表了记录计算结果。接着,来粗劣测试一下这两种方法的运行时间。上测试代码:
#include<iostream>#include<time.h>using namespace std;int jumpstep2(int n){ if(n == 1 || n ==2) return n; int *a = new int[n+1]; a[1] = 1; a[2] = 2; for(int i = 3; i <= n ; ++i){ a[i] = a[i-1] + a[i-2]; } int ret = a[n]; delete []a; return ret;}int jumpstep(int n){ if(n == 1 || n == 2) return n; else return jumpstep(n-1) + jumpstep(n-2);}void test_time(int (*func)(int), int n){ long bTime = clock(); cout<<"-----------------------------------"<<endl; cout<<"result is: "<<func(n)<<endl; long eTime = clock(); cout<<"cost time: "<<(eTime - bTime)<<"ms"<<endl;}void test(){ int n; cout<<"input n to test: "; cin>>n; test_time(jumpstep, n); test_time(jumpstep2, n);}int main(){ test(); return 0;}
运行结果如图:
统计为如下表:
当n = 50的时候,递归版本非常慢,等了好久都没出结果,于是干脆不等了。 当n比较大时,非递归版本运行速度比较高。
参考:
http://zhedahht.blog.163.com/blog/static/25411174200731844235261/
0 0
- 跳台阶问题(变态跳台阶)
- 跳台阶问题(变态跳台阶)
- 跳台阶与变态跳台阶问题
- 青蛙跳台阶,变态跳台阶问题
- 跳台阶问题(变态跳台阶)
- 跳台阶问题(变态跳台阶)
- 跳台阶以及变态跳台阶问题
- 青蛙跳台阶/变态跳台阶问题
- 跳台阶问题--总结
- 27.跳台阶问题
- 青蛙跳台阶问题
- 27、跳台阶问题
- 跳台阶问题
- 跳台阶问题
- 27.跳台阶问题
- 跳台阶问题
- 跳台阶问题
- 跳台阶问题
- android 开发中通过JNI无法向SD卡写入文件的解决办法
- JAVA学习之 浅析Filter
- OpenStack OVS GRE/VXLAN网络
- 常成员函数:Const类限定的成员函数
- os上的hadoop执行环境及eclipse嵌入hadoop开发环境配置记录
- 跳台阶问题
- js面向对象编程之静态方法与实例方法
- MyEclipse 快捷键
- makefile模板
- Vim命令合集
- 好程序员训练营,让你成为名副其实的好程序员
- 燃烧的三国开发笔记 1
- Spring aop 拦截器(即面向切面编程)
- Python线程通信