爬楼梯算法-java(递归与非递归)
爬楼梯算法-java
在网上看到一个爬楼梯的算法,这里记录一下:
第一种题目(递归实现):
假设一个楼梯有 N 阶台阶,人每次最多可以跨 M 阶,求总共的爬楼梯方案数。
例如楼梯总共有3个台阶,人每次最多跨2个台阶,也就是说人每次可以走1个,也可以走2个,但最多不会超过2个,那么楼梯总共有这么几种走法:
我们使用递归处理,在最后最多可跨越阶数大于剩余台阶的时候,需要做处理。
递归函数如下:
private static int calculateCount(int ladder, int maxJump) {int jump = 0;if (ladder == 0) {return 1;}if (ladder >= maxJump) {// 剩下的楼梯大于最大可跳跃数for (int i = 1; i <= maxJump; i++) {jump += calculateCount(ladder - i, maxJump);}} else {// 剩下的楼梯不足最大可跳跃数jump = calculateCount(ladder, ladder);}return jump;
}
调用方式:
public static void main(String[] args) {int ladder = 4;int maxJump = 2;int i = calculateCount(ladder, maxJump);System.out.println(i);
}
这题有一道变体(非递归方式实现):
假设一个楼梯有 N 阶台阶,人每次最多可以跨 2 阶,求总共的爬楼梯方案数,要求不用递归实现
先不写代码,自己计算当楼梯数为1、2、3、4、5时,对应的爬法有:1、2、3、5、8、13、21种。
可以发现,随着楼梯数n的增加,爬法总数呈现斐波那契数列规律增加,即f(n) = f(n-1) + f(n-2)
知道这个规律后,使用下面的循环即可实现:
/*** @param ladder 台阶数量* @return 总的爬法*/
private static int count(int ladder) {if (ladder == 1 || ladder == 2) {return ladder;}int n1 = 1;int n2 = 2;for (int i = 3; i <= ladder; i++) {int tmp = n2;n2 = n1 + n2;n1 = tmp;}return n2;
}
调用代码:
for (int i = 1; i <= 9; i++) {System.out.println("当楼梯数为 " + i + " 时,有 " + count(i) + " 总爬法");
}
最后输出的结果为:
参考:
http://50vip.com/77.html
http://thecodesample.com/?p=1083
爬楼梯算法-java(递归与非递归)相关推荐
- 左神算法:分别用递归和非递归方式实现二叉树先序、中序和后序遍历(Java版)
本题来自左神<程序员代码面试指南>"分别用递归和非递归方式实现二叉树先序.中序和后序遍历"题目. 题目 用递归和非递归方式,分别按照二叉树先序.中序和后序打印所有的节点 ...
- java 反转二叉树 非递归_【刷算法】翻转二叉树的递归和非递归解法
题目描述 操作给定的二叉树,将其变翻转为源二叉树的镜像. 输入描述: 1 1 / \ / \ 2 3 ------> 3 2 / \ / \ / \ / \ 4 5 6 7 7 6 5 4 解题 ...
- 树与二叉树的深度优先与广度优先算法(递归与非递归)
本博客前面文章已对树与二叉树有过简单的介绍,本文主要是重点介绍有关二叉树的一些具体操作与应用 阅读本文前,可以先参考本博客 各种基本算法实现小结(三)-- 树与二叉树 和 各种基本算法实现小结( ...
- 九十五、二叉树的递归和非递归的遍历算法模板
@Author:Runsen 刷Leetcode,需要知道一定的算法模板,本次先总结下二叉树的递归和非递归的遍历算法模板. 二叉树的四种遍历方式,前中后加上层序遍历.对于二叉树的前中后层序遍历,每种遍 ...
- 二叉树创建及遍历算法(递归及非递归)(转)
//二叉树处理头文件 //包括二叉树的结构定义,二叉树的创建,遍历算法(递归及非递归), /* 作者:成晓旭 时间:2001年10月7日(18:49:38-20:00:00) 内容:完成二叉树创建,二 ...
- 扫描java类文件_java递归与非递归实现扫描文件夹下文件的实例代码
java递归与非递归实现扫描文件夹下所有文件 java扫描指定文件夹下面的所有文件,供大家参考,具体内容如下 扫描一个文件夹下面的所有文件,因为文件夹的层数没有限制可能多达几十层几百层,通常会采用两种 ...
- java 递归改非递归_使用Java ThreadLocals的意外递归保护
java 递归改非递归 对于那些使用第三方工具来尝试扩展它们而又不完全了解它们的人来说,这是一个小技巧. 假定以下情况: 您想扩展一个展示分层数据模型的库(假设您要扩展Apache Jackrabbi ...
- 算法之快速排序(递归和非递归)
快速排序的两种实现方式.递归和非递归 1 package com.ebiz.sort; 2 3 import java.text.SimpleDateFormat; 4 import java.uti ...
- 【恋上数据结构】递归(函数调用过程、斐波那契数列、上楼梯、汉诺塔、递归转非递归、尾调用)
递归(Recursion) 什么是递归? 函数的调用过程(栈空间) 函数的递归调用过程 递归实例分析(1 + 2 + 3 + ... + 100 的和) 递归的基本思想.使用套路 斐波那契数列 fib ...
- JAVA常用算法一:二分查找【递归 or 非递归】
文章目录 一.Java实现二分查找[递归] 二.Java实现二分查找[非递归] 三.测试 一.Java实现二分查找[递归] //递归使用二分查找public static int binarySear ...
最新文章
- openstack虚拟机内文件遭破坏的急救方案
- linux shell 逻辑判断 [] [[]] -n -z 用法区别
- xadmin 更改后台一级目录名称
- Java Jsoup库 实现天气爬取(附第三方库加载方式)
- python--装饰器(附偏函数、断言)
- TIOBE 11月编程语言排行:Java首次跌出前二,Python 势不可挡。
- maven ant_如何在Maven中运行Ant目标?
- java环境变量代表的含义_java 环境变量的涵义
- phpredis报错信息:protocol error, got ‘o‘ as reply type byte解决方案
- vb中findwindow的疑惑
- 有限项加和的极限求解思路定式
- 服务器4通道性能相当于多少人民币,有钱人的世界我们不懂,组装电脑花费百来万,跑分世界第四...
- VS中Windows界面开发
- 唐宇迪学习笔记2:Python数据分析处理库——pandas
- 单片机课设中期报告_毕业论文--中期检查情况报告(40页)详解.doc
- Python的列表解析式,集合解析式,字典解析式
- RE管理器4.41、车来了app 去除广告
- 2018中国大学生程序设计竞赛 – 网络选拔赛 1001 Buy and Resell [模拟]
- (数据结构)1.实现顺序栈的各种基本运算 2.实现环形队列的各种基本运算
- 抖音xg8404 X-Gorgon算法 IOS苹果协议算法