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

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

阅读更多
/**
 *
 * @author SunnyMoon
 */

/**
 * 概念介绍:
 * 
 * 递归的二分查找: 想用最少的比较次数在一个有序的数组中找到一个给定的数据项。
 * 
 * 非递归的二分查找:二分查找也可以用非递归的算法,但是分治算法通常要回到递归。分治算
 *                  法常常是一个方法,在这个方法中含有两个对自身的递归的调用。
 * 
 * 分治算法:递归的二分查找是分治算法的一种实现方法。把一个是问题分成两个更小的问题,
 *          并且解决它们。这个过程一直持续下去直到易于求解的基值情况,就不需再分了。
 *          分治算法常常是一上方法,在这个方法中含有两个对自身的递归调用,分别对应于
 *          问题的两个部分。在二分查找中,就有两个这样的调用,但是只有一个真的执行了
 *          (调用哪一个取决于关键字的值)。        
 * 递归的效率:调用一个方法会有一定的代价和开销。首先,控制必须须从当前位置转移到调用
 *            方法的开始处。其次,传给这个方法的参数以及这个方法返回地址都要初压到一
 *            个栈里,为的是方法能够访问参数以及知道返回值在存储在哪里,这个过程也称
 *            "保存现场"。递归方法的使用的本质是从概念上简化了问题,而不是因为它更有
 *            效率。当使用递归的效率很低的时候,就可以考虑如果把递归转化成非递归。
 */
class OrdArray {

    private long[] a;
    private int nElems;

    public OrdArray(int max) {
        a = new long[max];
        nElems = 0;
    }

    public int size() {
        return nElems;
    }

    public int find(long searchKey) {
        return recFind(searchKey, 0, nElems - 1);//调用递归方法
        //return recFind2(searchKey, 0, nElems - 1);//调用非递归方法
    }

    public int recFind(long searchKey, int lowerBound, int upperBound) {//递归方法定义
        int curIn = (lowerBound + upperBound) / 2;
        if (a[curIn] == searchKey) {
            return curIn;
        } else if (lowerBound > upperBound) {
            return nElems;
        } else {
            if (a[curIn] < searchKey) {
                return recFind(searchKey, curIn + 1, upperBound);
            } else {
                return recFind(searchKey, lowerBound, curIn - 1);
            }
        }
    }
    public int recFind2(long searchKey, int lowerBound, int upperBound){//非递归方法定义
        int curIn=0;
        
        while(true){
            curIn=(lowerBound+upperBound)/2;
            if(a[curIn]==searchKey)
                return curIn;
            else if(lowerBound>upperBound)
                return nElems;
            else{
                if(a[curIn]<searchKey){
                    lowerBound=curIn+1;
                }
                else{
                    upperBound=curIn-1;
                }
            }
        }
    }
    public void insert(long value){
        int j;
        for(j=0; j<nElems; j++)
            if(a[j]>value)
                break;
        for(int k=nElems; k>j; k--)
                a[k]=a[k-1];
                a[j]=value;
                nElems++;
    }
    public void display(){
        for(int j=0; j<nElems; j++){
            System.out.println(a[j]+"");
        }
    }
}
class BinarySearchApp{
    public static void main(String[] args){
        int maxSize=100;
        OrdArray arr=new OrdArray(maxSize);
        
        arr.insert(72);
        arr.insert(90);
        arr.insert(45);
        arr.insert(126);
        arr.insert(54);
        arr.insert(99);
        arr.insert(144);
        arr.insert(27);
        arr.insert(135);
        arr.insert(81);
        arr.insert(18);
        arr.insert(100);
        arr.insert(9);
        arr.insert(117);
        arr.insert(63);
        arr.insert(36);
        arr.display();
        
        int searchKey=100;
        if(arr.find(searchKey) !=arr.size())
            System.out.println("Found "+searchKey);
        else
            System.out.println("Can't find "+ searchKey);
    }
}
/**
 * 运行结果:
 * 9
 * 18
 * 27
 * 36
 * 45
 * 54
 * 63
 * 72
 * 81
 * 90
 * 99
 * 100
 * 117
 * 126
 * 135
 * 144
 * Found 100
 */
/**
 * 总结:
 * 很多的数学问题都使用递归的方法解决,比如找两个数的最大公约数,求一个数的
 * 乘方等等。如果有效率需求的时候,可以再考虑将递归转化成非递归。
 */
 
分享到:
评论
2 楼 sunnymoon 2008-11-25  
zhanglubing927 写道

我也来写一个关于递归的. (前几天的笔试题,不知道当时写对没,下来完成了它.)


Java代码

package&nbsp;com.jason.exam; &nbsp;&nbsp;
&nbsp;&nbsp;
/** &nbsp;
&nbsp;*&nbsp;杨辉三角 &nbsp;
&nbsp;* &nbsp;
&nbsp;*&nbsp;@author&nbsp;Jason&nbsp;Zhang &nbsp;
&nbsp;* &nbsp;
&nbsp;*/&nbsp;&nbsp;
public&nbsp;class&nbsp;YangHuiTriangle&nbsp;{ &nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;/** &nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;根据位置获得杨辉数 &nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* &nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;m&nbsp;行数 &nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;n&nbsp;列数 &nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;所在行列的杨辉数 &nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;int&nbsp;YangHuiNumber(int&nbsp;m,&nbsp;int&nbsp;n)&nbsp;{ &nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(m&nbsp;==&nbsp;0&nbsp;||&nbsp;n&nbsp;==&nbsp;0) &nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1; &nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(n&nbsp;&gt;&nbsp;m&nbsp;/&nbsp;2) &nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;YangHuiNumber(m,&nbsp;m&nbsp;-&nbsp;n); &nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;YangHuiNumber(m&nbsp;-&nbsp;1,&nbsp;n&nbsp;-&nbsp;1)&nbsp;+&nbsp;YangHuiNumber(m&nbsp;-&nbsp;1,&nbsp;n); &nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{ &nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;N&nbsp;=&nbsp;10; &nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;m&nbsp;=&nbsp;0;&nbsp;m&nbsp;&lt;&nbsp;N;&nbsp;m++)&nbsp;{ &nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;n&nbsp;=&nbsp;0;&nbsp;n&nbsp;&lt;=&nbsp;m;&nbsp;n++)&nbsp;{ &nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(YangHuiNumber(m,&nbsp;n)&nbsp;+&nbsp;"&nbsp;"); &nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(); &nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
}&nbsp;&nbsp;package com.jason.exam;

/**
* 杨辉三角
*
* @author Jason Zhang
*
*/
public class YangHuiTriangle {
    /**
     * 根据位置获得杨辉数
     *
     * @param m 行数
     * @param n 列数
     * @return 所在行列的杨辉数
     */
    private static int YangHuiNumber(int m, int n) {
        if (m == 0 || n == 0)
            return 1;
        if (n &gt; m / 2)
            return YangHuiNumber(m, m - n);
        return YangHuiNumber(m - 1, n - 1) + YangHuiNumber(m - 1, n);
    }

    public static void main(String[] args) {
        int N = 10;
        for (int m = 0; m &lt; N; m++) {
            for (int n = 0; n &lt;= m; n++) {
                System.out.print(YangHuiNumber(m, n) + " ");
            }
            System.out.println();
        }
    }
}
这个是不是性能不好,因为每一个数字都通过计算才得出的. 比如我求YangHuiNumber(100,20),我需要计算前面所有的数字 而实际上前面已经得到了过YangHuiNumber(99,19)和YangHuiNumber(99,20). 没必要再计算他们...


提两个见意:
1. 你的递归实现存在问题。应该研究一下递归是什么样子的再来写。
2. 编码规则上来看,当为常量时才写成大写。(int N = 10;)
1 楼 zhanglubing927 2008-11-25  

我也来写一个关于递归的.
(前几天的笔试题,不知道当时写对没,下来完成了它.)
package com.jason.exam;

/**
 * 杨辉三角
 *
 * @author Jason Zhang
 *
 */
public class YangHuiTriangle {
    /**
     * 根据位置获得杨辉数
     *
     * @param m 行数
     * @param n 列数
     * @return 所在行列的杨辉数
     */
    private static int YangHuiNumber(int m, int n) {
        if (m == 0 || n == 0)
            return 1;
        if (n > m / 2)
            return YangHuiNumber(m, m - n);
        return YangHuiNumber(m - 1, n - 1) + YangHuiNumber(m - 1, n);
    }

    public static void main(String[] args) {
        int N = 10;
        for (int m = 0; m < N; m++) {
            for (int n = 0; n <= m; n++) {
                System.out.print(YangHuiNumber(m, n) + " ");
            }
            System.out.println();
        }
    }
}


这个是不是性能不好,因为每一个数字都通过计算才得出的.
比如我求YangHuiNumber(100,20),我需要计算前面所有的数字
而实际上前面已经得到了过YangHuiNumber(99,19)和YangHuiNumber(99,20).
没必要再计算他们...

相关推荐

    java数据结构与算法.pdf

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

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

    数据结构与算法是计算机科学的基础,对于理解和解决复杂问题至关重要。...通过阅读《数据结构与算法(JAVA语言版)》这本书,你将深入理解这些概念,并能熟练运用Java语言实现它们,从而提升你的编程能力。

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

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

    java数据结构递归算法

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

    数据结构与算法分析(java版内含源代码)

    《数据结构与算法分析》是计算机科学领域的一本经典著作,尤其在Java版本中,它深入探讨了如何在Java编程语言中实现各种数据结构和算法。这本书不仅提供了理论知识,还通过提供源代码实例,帮助读者更好地理解和应用...

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

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

    数据结构与算法分析_java语言描述

    本书的目的是从抽象思维和问题求解的观点提供对数据结构的实用介绍,试图包含有关数据结构、算法分析及其Java实现的所有重要的细节。作者采用了独特的方法将数据结构分成说明和实现两部分,并充分利用了已有的数据...

    数据结构与算法JAVA版

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

    数据结构与算法 java版

    数据结构与算法是计算机科学的基础,对于任何编程语言来说,理解和掌握它们都是至关重要的,特别是对于Java这样的高级语言。在Java中实现数据结构和算法,能够帮助开发者编写更高效、可维护的代码。 《Java数据结构...

    数据结构与算法分析java版

    ### 数据结构与算法分析Java版 #### 一、概述 《数据结构与算法分析Java版》是一本由Robert Lafore撰写的书籍,该书详细介绍了如何利用Java编程语言来实现和操作各种数据结构和算法。全书共分为六个部分,分别涵盖...

    数据结构与算法(java版)

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

    数据结构与算法分析_Java语言描述(第2版) 源代码

    《数据结构与算法分析_Java语言描述(第2版) 源代码》是一本深入探讨数据结构和算法的书籍,其源代码是学习和理解书中理论的重要实践资源。这本书籍主要面向计算机科学专业的学生以及对算法有深入研究需求的开发者。...

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

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

    数据结构与算法java版

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

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

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

    Java数据结构和算法.pdf

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

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

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

Global site tag (gtag.js) - Google Analytics