问题:

从楼上走到楼下有n个台阶,每一步有3中走法:走1个台阶,走2个台阶,走3个台阶。

如:

当有1个台阶时,有1种走法

当有2个台阶时,有2种走法

当有3个台阶时,有4钟走法

求:

当有4个台阶时,有几种走法?

当有5个台阶时,有几种走法?

当有100个台阶时,有几种走法?

请设计程序计算,对于给定的n个台阶,有几种走法?

解答思路

1.想到类似斐波那契数列算法,得出F(n)=F(n-1)+F(n-2)+F(n-3),采用递归的办法实现,如下面calucate1方法可实现。

但有个问题是随着楼梯台阶增多,计算量会成指数增长,时间复杂度会大大增加。

2.采用excel计算的思路,在excel中,重上往下先定义4个值,如

a1=1,a2=2,a3=4,a4=7,选中a2,a3,a4,采用公式F(n)=F(n-1)+F(n-2)+F(n-3)的形式,计算a5到a100的值

如下面calucate2方法可实现。

这样实现不太好,数组有可能太长

3.采用定长数组,循环替换的方式,参考calucate3方法可实现。

还有一个问题,当n=100时,数值会很大,在java中涉及到大数计算

4.采用BigInteger,参考calucate4方法可实现。

备注:

先分享我对这个问题的思考,抛砖引玉,欢迎大家讨论,里面还有什么问题,还可以怎么优化

import java.math.BigInteger;

public class Stair {

public static int calucate1(int i){

if(i<=0){

return 0;

}

switch (i){

case 1:

return 1;

case 2:

return 2;

case 3:

return 4;

default:

return calucate1(i-1)+calucate1(i-2)+calucate1(i-3);

}

}

public static int calucate2(int i){

if(i<=0){

return 0;

}

switch (i){

//第1个台阶

case 1:

return 1;

//第2个台阶

case 2:

return 2;

//第3个台阶

case 3:

return 4;

//第i个台阶

default:

int[] data=new int[i];

data[0]=1;

data[1]=2;

data[2]=4;

for(int j=4;j<=i;j++){

//计算第j个台阶时有多少种走法

data[j-1]=data[j-2]+data[j-3]+data[j-4];

}

//返回第i个台阶时有多少种走法

return data[i-1];

}

}

public static int calucate3(int i){

if(i<=0){

return 0;

}

switch (i){

//第1个台阶

case 1:

return 1;

//第2个台阶

case 2:

return 2;

//第3个台阶

case 3:

return 4;

//第i个台阶

default:

//初始化第一个,第二个,第三个台阶时的走法

int[] data={1,2,4};

for(int j=4;j<=i;j++){

//定义数组下标值

int index= (j-1)%3;

//计算数值

int temp=data[0]+data[1]+data[2];

//替换目标下标值所在位置的数值

data[index]=temp;

}

return data[(i-1)%3];

}

}

public static BigInteger calucate4(int i){

if(i<=0){

return new BigInteger("0");

}

switch (i){

//第1个台阶

case 1:

return new BigInteger("1");

//第2个台阶

case 2:

return new BigInteger("2");

//第3个台阶

case 3:

return new BigInteger("4");

//第i个台阶

default:

//初始化第一个,第二个,第三个台阶时的走法

BigInteger[] data={new BigInteger("1"),new BigInteger("2"),new BigInteger("4")};

for(int j=4;j<=i;j++){

//定义数组下标值

int index= (j-1)%3;

//计算数值

BigInteger temp=data[0].add(data[1]).add(data[2]);

//替换目标下标值所在位置的数值

data[index]=temp;

}

return data[(i-1)%3];

}

}

public static void main(String[] args) {

System.out.println("---------------------1------------------------");

//采用递归的思路

System.out.println(calucate1(4)); //7

System.out.println(calucate1(5)); //13

System.out.println(calucate1(19)); //66012

// System.out.println(calucate1(100)); //递归层级计算次数太多,代码执行起来时间复杂度巨大

System.out.println("---------------------2------------------------");

//excel从上往下拖动的思路

System.out.println(calucate2(4)); //7

System.out.println(calucate2(5)); //13

System.out.println(calucate2(19)); //66012

System.out.println(calucate2(100)); //随着台阶数量增长,数组长度也增长,浪费空间

System.out.println("---------------------3------------------------");

//采用数组值交替计算的思路

System.out.println(calucate3(4)); //7

System.out.println(calucate3(5)); //13

System.out.println(calucate3(19)); //66012

System.out.println(calucate3(100)); //可以计算值

//解决大数值计算的问题

System.out.println("---------------------4------------------------");

System.out.println(calucate4(4)); //7

System.out.println(calucate4(5)); //13

System.out.println(calucate4(11)); //66012

System.out.println(calucate4(1000)); //可以计算值

}

}

爬楼梯 java_爬楼梯问题java实现相关推荐

  1. 程序设计爬楼梯问题_楼梯案例:解决楼梯问题的C ++程序

    程序设计爬楼梯问题 A child is running up a staircase with N steps, and can hop 1 step, 2 steps or 3 steps at ...

  2. 爬楼梯和爬楼梯进阶c++

    该题是动态规划入门题,可扩展性较强.主要思想参考代码随想录 文章目录 题目分析 题目描述 题目分析 实践步骤 代码实现 总结: 复杂度 知识考察 题目分析 题目描述 基础爬楼梯,每次以1或2步爬楼梯, ...

  3. Python3.x爬虫教程:爬网页、爬图片、自己主动登录

    林炳文Evankaka原创作品. 转载请注明出处http://blog.csdn.net/evankaka 摘要:本文将使用Python3.4爬网页.爬图片.自己主动登录.并对HTTP协议做了一个简单 ...

  4. Python3.x爬虫教程:爬网页、爬图片、自动登录

    林炳文Evankaka原创作品.转载请注明出处 http://blog.csdn.net/evankaka 摘要:本文将使用Python3.4爬网页.爬图片.自动登录.并对HTTP协议做了一个简单的介 ...

  5. 2 爬虫 数据解析(bs4,XPath) robots协议 cookie反爬 代理反爬

    爬虫 1 数据解析 1.1 介绍 1.1.1 概念即作用 数据解析就是将一组数据中的局部数据进行提取,用于实现聚焦爬虫. 聚焦爬虫是建立在通用爬虫的基础上,从通用爬虫获取的整个源码数据中提取出指定的数 ...

  6. 爬了个爬(一)爬虫入门

    一.爬虫定义 网络爬虫:(又被称为网页蜘蛛,网络机器人,在FOFA社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本. URI(Uniform Resourc ...

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

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

  8. 【动态规划】爬楼梯爬的不仅仅是楼梯

    深度思考爬楼梯问题,抽取一般过程,目标是对其变式题也能认出并且求解 一.题目描述 假设你正在爬楼梯.需要 n 阶你才能到达楼顶.每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? ...

  9. python爬楼梯_Python3爬楼梯算法示例

    Python3爬楼梯算法示例 本文实例讲述了Python3爬楼梯算法.分享给大家供大家参考,具体如下: 假设你正在爬楼梯.需要 n 步你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同 ...

  10. 蚂蚁爬绳java_腾讯面试题——蚂蚁爬行(Java版)

    /** * 蚂蚁类,用于记录蚂蚁的状态及控制蚂蚁行为 */ public class Ant { /** * 蚂蚁爬行方向枚举值 */ public interface Direction { /** ...

最新文章

  1. 从指南针到北斗:中国导航系统促进世界互联互通
  2. php 析构不执行,PHP析构方法 __destruct() 不触发的两个解决办法
  3. 树莓派教程之树莓派系统镜像刷入和远程登陆(1)
  4. mysql的配置和启动命令
  5. 华为,15万大军孤独行走在世界上
  6. 《程序员修炼之道》笔记(九)
  7. WPF入门教程系列十三——依赖属性(三)
  8. linux如何使用vnc远程登录,如何使用Xmanager及VNC登录远程桌面
  9. JMF调用摄像头粉屏的问题(win10 64位系统)
  10. 什么叫诚实_李现自爆平常最爱看小姐姐!IG按赞被抓包 网友赞:诚实
  11. 【洛谷】【lca+结论】P3398 仓鼠找sugar
  12. 安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(一)
  13. linux之grep使用技巧
  14. docker es持久化_docker如何保持数据持久化?其实可以考虑通过数据卷挂载的方式~...
  15. 1.2 XML 的基本语法
  16. gels imagej 图片处理_科研论文作图之ImageJ
  17. oracle 创建包 def,cognos创建oracle 数据源报错QE-DEF-0285
  18. 人工智能如何影响5G网络标准?
  19. 作为初学者,第一次用div+css编写淘宝静态首屏
  20. JVM jvmpi (转)

热门文章

  1. 计算机程序停止工作怎么办,如何将“某某程序已正常停止工作,请关闭程序”这个提示自动关闭...
  2. springcloud学习-Eureka、Eureka高可用集群、Ribbon客户端负载均衡策略
  3. oracle sequence nextval,SOS!!! Sequence.nextval 的问题
  4. oracle数据存储层级
  5. 读书笔记-《墨菲定律》
  6. 【其他专题】好用的截图(包括动图gif)软件分享
  7. 如何将手机里的小视频做成GIF动图?一键轻松生成GIF动画
  8. 中国猫道系统市场趋势报告、技术动态创新及市场预测
  9. 工期计算机在线,工期日历计算器
  10. Pycharm修改镜像源并添加信任