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

数据结构与算法(JAVA篇)之递归算法(四)

阅读更多
/**
 *
 * @author SunnyMoon
 */
//////////////////////////////////////////////////////////////////////////////
/**
 * 概念介绍:
 * 
 * 消除递归:
 * 一个算法作为一个递归的方法通常从概念上很容易理解,但实际使用中递归的效率不高,在这种
 * 情况下,把递归算法转换成非递归的算法是非常有用的,这种转换经常用到栈。
 * 
 * 递归和栈:
 * 递归和栈之间有着紧密的联系,大部分的编译器使用栈实现递归的。
 * 
 * 调用方法的时候发生什么:
 * 1. 编译器会把这个方法所有当前参数及返回地址压入栈中;
 * 2. 将控制权交给这个方法,方法通过获得栈顶元素值访问参数;
 * 3. 方法运行结束的时候,值退栈,参数消失且控制权重新回到返回地址;
 * 
 * 模拟递归方法:
 * 可以将任意一个递归方法转换为非递归的基于栈的方法。在一些简单的情况可以完全消除栈,只
 * 使用一个简单的循环,但是在很复杂的情况,算法中必须须要保留栈。本例子是简单的情况,可
 * 以进一步完全消除栈。
 */
/////////////////////////////////////////////////////////////////////////////
 /**
  * 计算三角数字的问题:
  * 递归算法描述如下
  * int triiangle(int n){
  *      if(n==1)
  *          return 1;
  *      else
  *          return (n+triangle(n-1));
  * }
  */
import java.io.*;
/**
 * 模拟一个递归方法,通用的方式消除递归
 */
class Params {//封装了方法的返回地址和方法的参数

    public int number;
    public int returnAddress;

    public Params(int num, int returnAdd) {
        number = num;
        returnAddress = returnAdd;
    }
}

class StackX {//模拟递归时使用的栈

    private int maxSize;
    private Params[] stackArray;
    private int top;

    public StackX(int s) {
        maxSize = s;
        stackArray = new Params[maxSize];
        top = -1;
    }

    public void push(Params p) {
        stackArray[++top] = p;
    }

    public Params pop() {
        return stackArray[top--];
    }

    public Params peek() {
        return stackArray[top];
    }
}

class StackTriangleApp {

    static int theNumber;
    static int theAnswer;
    static StackX theStack;
    static int logicAddress;
    static Params theseParams;

    public static void main(String[] args) throws IOException{//主方法
        System.out.print("Number = ");
        theNumber = getInt();
        stackTriangle();
        System.out.println("");
        System.out.println("Trriangle = " + theAnswer);
    }

    @SuppressWarnings("empty-statement")
    public static void stackTriangle() {//计算三角数字的方法,模拟递归方法
        theStack = new StackX(100);
        logicAddress = 1;//设置一个逻辑地址为入口地址
        while (step() == false);
    }

    public static boolean step() {
        switch (logicAddress) {
            case 1:
                theseParams = new Params(theNumber, 6);//设定循环返回的地址
                theStack.push(theseParams);
                logicAddress = 2;
                break;
            case 2:
                theseParams = theStack.peek();
                if (theseParams.number == 1) {
                    theAnswer = 1;
                    logicAddress = 5;
                } else {
                    logicAddress = 3;
                }
                break;
            case 3:
                Params newParams = new Params(theseParams.number - 1, 4);
                theStack.push(newParams);
                logicAddress = 2;
                break;
            case 4:
                theseParams = theStack.peek();
                theAnswer = theAnswer + theseParams.number;
                logicAddress = 5;
                break;
            case 5:
                theseParams = theStack.peek();
                logicAddress = theseParams.returnAddress;
                theStack.pop();
                break;
            case 6:
                return true;
        }
        return false;
    }

    public static String getString() throws IOException{
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);
        String s = br.readLine();
        return s;
    }
    public static int getInt() throws IOException{
        String s=getString();
        return Integer.parseInt(s);
    }
}
/**
 * 总结:
 * 当要求效率的时候可以把弟归转化为基于栈的非递归,进而可以把基于栈的转化为仅有循环的
 * 非递归,这种情况下效率是最高的。
 * 但是一些复杂的情况可以转化为基于栈的非递归,但是无法消除栈的。
 * 一些递归的算法是非常优秀的,比如分治算法。
 */
 
分享到:
评论

相关推荐

    数据结构与算法(JAVA篇)之递归算法(二)

    ### 数据结构与算法(JAVA篇)之递归算法(二) #### 递归与二分查找 本文将探讨递归算法中的一个重要应用——二分查找,并对比递归与非递归两种实现方式。 ##### 递归的概念介绍 递归是一种算法设计策略,它...

    java数据结构与算法.pdf

    Java作为广泛应用的编程语言,其在实现数据结构和算法时有着丰富的库支持和优秀的可读性。下面将对标题和描述中提到的一些关键知识点进行详细解释。 1. **数据结构**: - **稀疏数组**:当大量数据中大部分为零或...

    数据结构与算法(JAVA篇)之递归算法

    ### 数据结构与算法(JAVA篇)之递归算法 #### 概念介绍 递归算法是一种常见的编程技术,尤其在解决具有重复子问题的问题时非常有效。递归算法的特点是函数自身调用自身来解决问题的不同部分,直到达到基本情况...

    java数据结构递归算法

    在这个"java数据结构递归算法"主题中,我们将深入探讨递归的基本概念、如何在Java中使用递归,以及一个著名的递归应用案例——八皇后问题。 递归是函数或方法调用自身的过程。它基于一个问题的规模缩小至基本情况,...

    数据结构与Java算法第四版

    《数据结构与Java算法第四版》是一本以Java为编程语言的教科书,适用于系统学习数据结构和算法的基本原理与应用。这本书特别关注于数据结构与算法的设计、分析和实现过程。在IEEE/ACM 2001计算机科学课程标准框架下...

    数据结构与算法分析(Java语言描述)习题答案(第三版).docx

    在《数据结构与算法分析(Java语言描述)》(第三版)这本教材中,我们看到涉及了关于数据结构、算法以及程序设计的基础概念。在给出的文档中,部分题目和答案涵盖了递归、数学推理、文件处理以及计算理论等多个方面...

    数据结构与算法JAVA版

    本资料包“数据结构与算法JAVA版”聚焦于这个核心主题,包含了用Java实现的各种数据结构和算法。 1. **数据结构**: - **数组**:是最基本的数据结构,提供了固定大小的存储空间,通过索引访问元素。Java中的数组...

    数据结构与算法(java版)

    数据结构与算法是计算机科学的基础,对于理解和解决复杂问题至关重要。在Java环境下,这些概念的实现使得程序设计更加高效和优化。以下将详细介绍标题和描述中提到的关键知识点: 1. **栈与队列**: - 栈(Stack)...

    C、C++、JAVA数据结构与算法电子书

    数据结构与算法是计算机科学的基础,对于理解和编写高效软件至关重要。C、C++和Java都是广泛使用的编程语言,它们在处理数据结构和算法时各有特点。以下是对这三种语言在数据结构与算法方面的一些关键知识点的详细...

    数据结构与算法java版

    ### 数据结构与算法Java版:深入理解编程基石 #### Java与面向对象程序设计:奠定编程基础 在《数据结构与算法Java版》一书中,Java作为面向对象编程语言的典范,其基础知识和面向对象特性被详尽阐述。从基本数据...

    Java数据结构和算法.pdf

    资源摘要信息是关于Java数据结构和算法的知识点总结,涵盖了数组、栈与队列、链表、递归、哈希表、高级排序、二叉树、红黑树、堆、带权图等数据结构和算法概念。 一、数组 * 数组是相同类型变量的集合,可以使用...

    数据结构与算法java版-不是很高清,不过还算全

    "数据结构与算法java版"这个资源虽然清晰度不高,但内容较为全面,涵盖了数据结构和算法的核心概念。 1. **数据结构**:数据结构是指在计算机中组织和存储数据的方式,它允许我们以高效的方式访问和修改数据。主要...

    数据结构与算法Java语言描述 部分代码实现

    本资源提供了"数据结构与算法Java语言描述 第二版 部分代码实现",这意味着你将能够学习到如何使用Java来实现各种数据结构和算法。 1. **数组**:数组是最基本的数据结构,它允许存储固定大小的同类型元素集合。在...

    数据结构与算法Java语言描述(源代码)

    本资源提供了"数据结构与算法Java语言描述(源代码)",帮助学习者通过实际代码深入理解这些概念。 1. **数组**:数组是最基本的数据结构,它允许存储固定数量的相同类型元素。在Java中,数组可以是一维、二维或...

    Java数据结构和算法-带书签目录扫描版

    《Java数据结构和算法-带书签目录扫描版》是一本深入探讨Java编程语言中数据结构和算法的书籍。此扫描版特别包含了完整的书签目录,使得读者在电子版阅读时能够快速定位到所需章节,提高了学习和查阅的效率。 在...

    数据结构与算法经典问题解析 java语言描述 原书第二版

    《数据结构与算法经典问题解析 Java语言描述》第二版是一本深入探讨计算机科学核心领域的书籍,专注于使用Java语言来阐述和实现数据结构和算法。这本书是程序员和计算机科学学生的宝贵资源,因为它涵盖了从基础到...

    数据结构与算法(JAVA语言版解密)

    本书《数据结构与算法(JAVA语言版解密)》详细介绍了数据结构和算法的基本概念,以及如何使用Java语言实现这些数据结构和算法。书中内容涵盖了面向对象程序设计的基础知识、数据结构与算法的核心理论、以及各类数据...

Global site tag (gtag.js) - Google Analytics