package od0109;
import java.util.ArrayList;
/**
* 楼梯总共N阶,小明可以一次可以跨1步,2步,3步,请用递归求出小明总共有多少种跨法走完这个楼梯。 具体走法
*
* @author Administrator
*
*/
public class Step {
public static void main(String[] args) {
Step step = new Step();
step.getSum(5);
}
// 楼梯总数为N阶
//int starisNum = 5;
// 总共有1步,2步,3步这几种跨法
int[] ways = { 1, 2, 3 };
// 统计总共有多少种跨法
int count = 0;
// 记录每次的具体步数
ArrayList<Integer> list = new ArrayList<Integer>();
int tempSteps = 0;
/**
* 回溯法
*
* @param tempSteps
* : 暂时走到第几个台阶了
*/
void getSum(int starisNum) {
if (tempSteps > starisNum)
return;
// 达到要求了,计数加一,并输出具体的步数
if (tempSteps == starisNum) {
count++;
System.out.println(count + " 具体步法为:" + list);
return;
}
// 到达一个状态时,都先尝试走下所有的分支可能,然后再依次回退,这样就可以回溯遍历所有的可能了
for (int i = 0; i < ways.length; i++) {
list.add(ways[i]);
tempSteps = tempSteps + ways[i];
getSum(starisNum);// 加way 的第二步骤
tempSteps = tempSteps - ways[i];
list.remove(list.size() - 1);
}
}
}