列出⾛楼梯或者台阶的所有⾛法
本篇⽂章主要⽤来简单模仿⾛楼梯或者台阶,列出⾛完楼梯或者台阶所有的⾛法。
第⼀个程序:给定台阶数,每次⾛1步,2步或者3步。
个案分析
第⼆个程序:给定台阶数据,每次⾛的最⼩台阶数,每次⾛的最⼤台阶数以及设定最多能⾛⼏次。采⽤Stack来实现。
[b]第⼀个程序和运⾏结果如下:[/b]
/**
* 程序主要⽤来简单模仿⾛楼梯(台阶). 给定台阶数,每次⾛1步, 2步或者 3步, 列出⾛完台阶所有的⾛法.
*
* 例如3级台阶就有四种⾛法:
* 1 1 1
* 1 2
* 2 1
* 3
*
* @author Eric
* @version 1.0
*
*/
public class Stairs {
// 统计个数
private int currentCount = 1;
/**
* @param remainingSteps
* :剩余的台阶数,开始调⽤的值是总的台阶数
* @param currentSteps
* :递归过程中某种情况下,已经⾛的步骤,如 1 2 ⾛了三步的情况早上空腹跑步
*/
public void walkStairs(int remainingSteps, String currentSteps) {
/*
* 当剩下⼩于等于三级台阶时,输出楼梯的⾛法
*/
if (remainingSteps <= 3) {
printWalkWays(remainingSteps, currentSteps);
} el {
for (int step = 1; step <= 3; step++) {
walkStairs(remainingSteps - step, currentSteps + " " + step);
}
}
}
private StringBuilder getCurrentCountStepInformation(String currentSteps) {
认识数字return new StringBuilder().append("第").append(currentCount++).append(
"种⾛法").append(currentSteps);
}
/**
* 输出满⾜条件的台阶⾛法
*
* @param remainingSteps
* @param currentSteps
*/
private void printWalkWays(int remainingSteps, String currentSteps) {
if (1 == remainingSteps) {
System.out.println(getCurrentCountStepInformation(currentSteps)
.append(" 1").toString());
} el if (2 == remainingSteps) {
System.out.println(getCurrentCountStepInformation(currentSteps)
.
append(" 1 1").toString());
System.out.println(getCurrentCountStepInformation(currentSteps) .append(" 2").toString());
} el if (3 == remainingSteps) {
System.out.println(getCurrentCountStepInformation(currentSteps) .append(" 1 1 1").toString());
System.out.println(getCurrentCountStepInformation(currentSteps) .append(" 1 2").toString());
System.out.println(getCurrentCountStepInformation(currentSteps) .append(" 2 1").toString());
System.out.println(getCurrentCountStepInformation(currentSteps) .append(" 3").toString());
} el {
/**
* 0 ==remainingSteps, 表明已经⾛完台阶了,直接输出就可以了
*/
System.out.println(getCurrentCountStepInformation(currentSteps) .toString());
手机没有网络信号是怎么回事}
}
public static void main(String args[]) {
Stairs s = new Stairs();
// 调⽤⽅法前需要先判断STEPS是否是⼤于0的。
s.walkStairs(5, "");
}
}
如⾛5阶台阶有如下⼏种⾛法:
第1种⾛法 1 1 1 1 1
第2种⾛法 1 1 1 2
第3种⾛法 1 1 2 1
第4种⾛法 1 1 3
第5种⾛法 1 2 1 1
第6种⾛法 1 2 2
第7种⾛法 1 3 1
第8种⾛法 2 1 1 1
第9种⾛法 2 1 2
第10种⾛法 2 2 1大专可以考公务员
第11种⾛法 2 3
第12种⾛法 3 1 1
第13种⾛法 3 2
[b]第⼆个程序和运⾏结果如下:[/b]
/**
* 题⽬:⾛楼梯
* 给定台阶数⽬ -- SUM,
* 每次最⼤的台阶数 -- MAX
* 每次最⼩的台阶数 -- MIN
* 期望值(最多在⼏步之内完成) -- EXPECT
*
* 思路:
* 采⽤递归的⽅法实现。采⽤Stack结构来存储。
*
*/
import java.util.Stack;
/**
/**
* 题⽬:⾛楼梯
* 给定台阶数⽬ -- SUM,
元始天王
* 每次最⼤的台阶数 -- MAX
* 每次最⼩的台阶数 -- MIN
* 期望值(最多在⼏步之内完成) -- EXPECT
*
* 思路:
* 采⽤递归的⽅法实现。采⽤Stack结构来存储。
*
* @author Eric
* @version 1.0
*
*/
public class Stair2 {
private Stack<Integer> stack = new Stack<Integer>();
private int currentCount = 0;
/**
* @param min
* @param max
* @param current
* @param expect
* @param sum
*/
private void getWalkWays(int min, int max, int current, int expect, int sum) { //当Stack中的数据和与总的台阶数⼀样时,输出结果
if (sum == current) {
//输出满⾜条件的内容,其中,期望值(最多在⼏步之内完成)
if ( expect >= stack.size()) {
print(stack);
}
}
//循环最⼩值到最⼤值
for (int currentIndex = min; currentIndex <= max; currentIndex++) {
/*
* 如果当前Stack中的值的和(current)加上当前循环的值(currentIndex) * ⼩于等于总的台阶数,那么就先把当前循环的值压⼊到Stack中,
* 当前Stack中所有数据值的和加上当选循环的值
* 递归调⽤getWalkWays⽅法
* 然后,将stack的pop值去掉并修改Stack中当前所有元素的和
*/
if (current + currentIndex <= sum) {
stack.push(currentIndex);
current += currentIndex;
getWalkWays(min, max, current, expect, sum);
current -= stack.pop();
}
}
}
/**
* 得到输出的前缀。
* 如:
* 第50中⾛法
* @return
*/
private String getCountInformation() {
return new StringBuilder().append("第").append(++currentCount).append( "中⾛法:").toString();
}
/**
* 打印当前Stack中的元素
老公老公我爱你* 如:
* 第50中⾛法:4 4 2
*
* @param stack
*/
private void print(Stack stack) {
// 添加满⾜条件集合的元素个数范围
StringBuilder sb = new StringBuilder();
sb.append(getCountInformation());
for (Object o : stack) {
sb.append(o).append(" ");
}
System.out.println(sb.deleteCharAt(sb.length() - 1).toString());
}
/**
* 输出符合条件的⾛楼梯条件信息。
个人自我鉴定*
*/
private void printResultTips(int min, int max, int sum, int expectTimes) {
System.out.println(new StringBuilder().append("条件==》").append("台阶数为").append(sum)
.append(", 每步⾛的最⼩台阶数为").append(min).append(", 每步⾛的最⼤台阶数为")
.append(max).append(",最多⾛的次数是").append(expectTimes).toString());
}
/**
* 测试⽅法
*
*/
public void test() {
int min = 2;
int max = 4;
int expectTimes = 4;
int totalSteps = 10;
printResultTips(min, max, totalSteps, expectTimes);
getWalkWays(min, max, 0,expectTimes,totalSteps);
}
public static void main(String[] args) {
//测试
new Stair2().test();
}
}
条件==》台阶数为10, 每步⾛的最⼩台阶数为2, 每步⾛的最⼤台阶数为4,最多⾛的次数是4 第1中⾛法:2 2 2 4
第2中⾛法:2 2 3 3
第3中⾛法:2 2 4 2
第4中⾛法:2 3 2 3
第5中⾛法:2 3 3 2
第6中⾛法:2 4 2 2
第7中⾛法:2 4 4
第8中⾛法:3 2 2 3
第9中⾛法:3 2 3 2
第10中⾛法:3 3 2 2
第11中⾛法:3 3 4
第12中⾛法:3 4 3
第13中⾛法:4 2 2 2
第14中⾛法:4 2 4
第15中⾛法:4 3 3 第16中⾛法:4 4 2