问题描述:一个人可以一步走1或2或3级台阶,问到N级台阶共有多少种走法,输出各种走法的路径?
分析:如果只是统计走法个数,简单的f(n)=f(n-1)+f(n-2)+f(n-3)【n>=3】即可,但要输出路径,如果考虑递归的话,显然会内存消耗非常大,而循环求解的话,因为每一步都能利用已经存储的值,所以效率更好一些。
具体参见代码:
package Staticsteps;
import java.util.ArrayList;
import java.util.List;
//存储路径用的结果节点 里面放了存储ArrayList的ArrayList
public class ResultNode {
private ArrayList<ArrayList<Integer>> resultList =null;
public ResultNode(){
resultList = new ArrayList<ArrayList<Integer>>();
}
public ArrayList<ArrayList<Integer>> getResultList(){
return resultList;
}
}
package Staticsteps;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Staticsteps {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int k = scanner.nextInt();
System.out.println("The result roads is :");
long startTime = System.currentTimeMillis();
if (k>0)
print(getResultRoad(k));
long endTime = System.currentTimeMillis();
System.out.println("Totally using "+(endTime-startTime)+" milliseconds");
}
public static ResultNode[] getResultRoad(int k){
ResultNode[] result = null ;
result = new ResultNode[k+1];
//f(n)=f(n-3)+f(n-2)+f(n-1)
for(int i = 0;i<k+1;i++){
int m =0;
result[i] = new ResultNode();
if(i==0){
ArrayList<Integer> alist = new ArrayList<Integer>();
alist.add(0);
result[0].getResultList().add(alist) ;
}
if(i-1>=0){//求f(n-1)
while(result[i-1]!=null
&&result[i-1].getResultList().size()>0
&&m<result[i-1].getResultList().size()){
ArrayList<Integer> p = (ArrayList<Integer>) result[i-1].getResultList().get(m).clone();
p.add(i);
result[i].getResultList().add(p);
m++;
}
m=0;
}
if(i-2>=0){//求f(n-2)
while(result[i-2]!=null
&&result[i-2].getResultList().size()>0
&&m<result[i-2].getResultList().size()){
ArrayList<Integer> q = (ArrayList<Integer>) result[i-2].getResultList().get(m).clone();
q.add(i);
result[i].getResultList().add(q);
m++;
}
m=0;
}
if(i-3>=0){//求f(n-3)
while(result[i-3]!=null
&&result[i-3].getResultList().size()>0
&&m<result[i-3].getResultList().size()){
ArrayList<Integer> z = (ArrayList<Integer>) result[i-3].getResultList().get(m).clone();
z.add(i);
result[i].getResultList().add(z);
m++;
}
m=0;
}
}
return result;
}
//打印路径个数和具体路径
public static void print(ResultNode[] result){
System.out.println("------reach to "+(result.length-1)+" totally has "+result[result.length-1].getResultList().size()+" roads------");
for(int i =0;i<result[result.length-1].getResultList().size();i++){
for(int j =0;j<result[result.length-1].getResultList().get(i).size();j++)
System.out.print(result[result.length-1].getResultList().get(i).get(j)+" ");
System.out.println();
}
}
//复制上一步的链表
public Object clone() {
Object o =null;
try{
o=(ArrayList<Integer>)super.clone();
}catch(CloneNotSupportedException e) {
System.out.println(e.toString());
}
return o;
}
}
说明:思考过程,想说简单的递归解法,然后想办法消除递归就可以,里面的clone方法是复用上一步计算结果的关键。
分享到:
相关推荐
n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---...
文件递归-XML递归-树图递归 面试中的常见递归算法:附带截图和详细代码
C语言目录递归经典代码Recurse-Directories-in-C
递归别出心裁的应用-240个人编了7天才完成的经典PPT。很值得学习。看完后,请点评下。谢谢!
java语法 method 递归 马克-to-win java视频 方法 重载
百鸡问题 递归与非递归求最大公约数 斐波那契数列递归与非递归算法 递归与非递归求阶乘
递归,可以实现多位数组的图像显示.......
两种mysql递归tree查询效率-mysql递归tree,提供两种递归算法
C++ C++教程 C++源码 C++程序设计 教程 标准C++程序设计教程 源代码 计算器 递归 递归计算器
【大纲】 0-1-课程内容和安排介绍 1-1-计算机的概念 ...第6章-函数与递归-2-函数的调用和返回值 第6章-函数与递归-3-改变参数值的函数 第6章-函数与递归-4-程序结构和递归 第6章-函数与递归-5-函数实例
递归算法详细分析- C.doc
递归分治-1-阶乘.cpp
基于于C++的使用递归的方式解0-1背包
在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)// 方法一:int F
【大纲】 0-1-课程内容和安排介绍 1-1-计算机的概念 ...第6章-函数与递归-2-函数的调用和返回值 第6章-函数与递归-3-改变参数值的函数 第6章-函数与递归-4-程序结构和递归 第6章-函数与递归-5-函数实例
【大纲】 0-1-课程内容和安排介绍 1-1-计算机的概念 ...第6章-函数与递归-2-函数的调用和返回值 第6章-函数与递归-3-改变参数值的函数 第6章-函数与递归-4-程序结构和递归 第6章-函数与递归-5-函数实例
【大纲】 0-1-课程内容和安排介绍 1-1-计算机的概念 ...第6章-函数与递归-2-函数的调用和返回值 第6章-函数与递归-3-改变参数值的函数 第6章-函数与递归-4-程序结构和递归 第6章-函数与递归-5-函数实例
2------前序遍历递归算法 3------前序遍历非递归算法 4------中序遍历递归算法 5------中序遍历非递归算法 6------后序遍历递归算法 7------后序遍历非递归算法 8------求树高 9------求叶子总数 10-----输出二叉树 ...
递归栏目方法系统-直销系统金子塔图递归栏目方法系统-直销系统金子塔图
第6章 函数和递归(C++版) 第二节 递归算法-2021-01-25(B).pdf