`
shuofenglxy
  • 浏览: 194503 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

消除递归典型应用2------N阶台阶问题

阅读更多

问题描述:一个人可以一步走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后问题---递归回溯法 n后问题---递归回溯法 n后问题---...

    递归-----动态树实现递归

    标题“递归-----动态树实现递归”暗示我们将探讨如何利用递归方法来操作动态树。 首先,让我们理解什么是动态树。动态树,顾名思义,是一种可以随程序运行而改变结构的树形数据结构。与静态树不同,它的节点可以在...

    算法基础与递归-百积问题-递归求公约数-求阶乘-斐波那契数列

    递归算法的基本思想是将问题分解成更小的子问题,然后使用同样的方法解决这些子问题,直到问题的规模小到可以直接解决为止。本文将通过实验和代码实现,来详细介绍递归算法的原理和应用。 一、递归算法的原理 递归...

    计算器递归----c++

    - **递归的应用场景**:对于含有括号的复杂表达式,递归可以有效地分解问题,先计算最内层括号内的表达式,然后逐步向外扩展,最终得到整个表达式的值。 ##### 2. **C++基础语法** - **头文件的引入**:`#...

    递归与分治--acm竞赛资料

    在ACM竞赛中,递归与分治是两种非常重要的算法思想,对于解决复杂问题有着极大的帮助。递归是通过函数自身调用解决问题的方法,而分治则是将一个大问题分解为若干个相同或相似的小问题,分别解决后再合并结果。下面...

    递归别出心裁的应用-240个人编了7天才完成的经典PPT

    递归别出心裁的应用-240个人编了7天才完成的经典PPT。很值得学习。看完后,请点评下。谢谢!

    消除文法左递归

    在编译原理中,消除文法的左递归是一个重要的概念,主要应用于解析器的构造。这个过程是为了使解析过程更加高效,避免无限循环的发生。本文将深入探讨左递归的定义、为何需要消除以及如何消除,同时结合课程设计与...

    java-c语法7---method-递归---马克-to-win java视频

    java语法 method 递归 马克-to-win java视频 方法 重载

    基于支持向量机递归特征消除(SVM-RFE)的回归数据特征选择算法,输出为选择的特征序号(Matlab完整程序和数据)

    Matlab基于支持向量机递归特征消除(SVM_RFE)的回归数据特征选择算法,matlab代码,输出为选择的特征序号(Matlab完整程序和数据) Matlab基于支持向量机递归特征消除(SVM_RFE)的回归数据特征选择算法,matlab代码,...

    递归下降语法分析--简单例子程序

    对于这种文法,需要进行消除左递归的预处理。 - 对于某些复杂的文法结构,递归下降解析器可能需要辅助数据结构(如堆栈或队列)来解决嵌套结构,否则会导致解析复杂度增加。 总结起来,递归下降解析是一种直观且...

    递归分治-1-阶乘.cpp

    递归分治-1-阶乘.cpp

    递归解0-1背包问题

    基于于C++的使用递归的方式解0-1背包

    fuziwang#review#递归和循环--斐波那契数列1

    在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n&gt;=3,n∈N*)// 方法一:int F

    Python语言程序设计教程 北理工Python课程第6章-函数与递归-4-程序结构和递归 共20页.pdf

    【大纲】0-1-课程内容和安排介绍1-1-计算机的概念1...函数与递归-1-函数定义第6章-函数与递归-2-函数的调用和返回值第6章-函数与递归-3-改变参数值的函数第6章-函数与递归-4-程序结构和递归第6章-函数与递归-5-函数实例

    消除左递归

    (2)使用消除左递归算法对文法 G 进行改写。 (3)输出消除了左递归的文法。 六、结论 消除左递归是 Context-Free Grammar 中的一项重要技术,用于消除文法中的左递归,生成等价的文法。通过消除左递归算法,...

    vue_ant-design-vue菜单递归

    在Vue.js框架中,Ant Design Vue是一个非常流行的UI组件库,它提供了丰富的界面元素和设计模式,便于开发者构建美观且功能强大的Web应用。本项目主要关注的是Ant Design Vue中的菜单(Menu)组件,特别是如何处理...

    0-1背包递归求解Java语言描述

    0-1背包问题是一个经典的计算机科学中的优化问题,它源于组合优化和图论领域,广泛应用于资源分配、项目选择等问题。在0-1背包问题中,我们有一个容量为W的背包,以及n件物品,每件物品有其价值v[i]和重量w[i]。目标...

    Python解决N阶台阶走法问题的方法分析

    通过上述分析可以看出,在解决N阶台阶走法问题时,递推算法相比递归算法具有更高的效率。然而,递归方法因其清晰简洁的逻辑仍然值得学习和掌握,它有助于培养解决问题的基本思路。无论选择哪种方法,关键是理解背后...

    递归实现汉诺塔-c#

    汉诺塔是一个经典的计算机科学问题,它涉及到递归算法的应用。在这个问题中,有三个柱子和一堆盘子,最初所有盘子按照大小顺序(大的在下,小的在上)放在第一个柱子上。目标是将所有盘子移动到第三个柱子上,每次...

Global site tag (gtag.js) - Google Analytics