`

递归算法(2)

阅读更多
  1. /**  
  2.  *  
  3.  * @author SunnyMoon  
  4.  */  
  5.   
  6. /**  
  7.  * 概念介绍:  
  8.  *   
  9.  * 递归的二分查找: 想用最少的比较次数在一个有序的数组中找到一个给定的数据项。  
  10.  *   
  11.  * 非递归的二分查找:二分查找也可以用非递归的算法,但是分治算法通常要回到递归。分治算  
  12.  *                  法常常是一个方法,在这个方法中含有两个对自身的递归的调用。  
  13.  *   
  14.  * 分治算法:递归的二分查找是分治算法的一种实现方法。把一个是问题分成两个更小的问题,  
  15.  *          并且解决它们。这个过程一直持续下去直到易于求解的基值情况,就不需再分了。  
  16.  *          分治算法常常是一上方法,在这个方法中含有两个对自身的递归调用,分别对应于  
  17.  *          问题的两个部分。在二分查找中,就有两个这样的调用,但是只有一个真的执行了  
  18.  *          (调用哪一个取决于关键字的值)。          
  19.  * 递归的效率:调用一个方法会有一定的代价和开销。首先,控制必须须从当前位置转移到调用  
  20.  *            方法的开始处。其次,传给这个方法的参数以及这个方法返回地址都要初压到一  
  21.  *            个栈里,为的是方法能够访问参数以及知道返回值在存储在哪里,这个过程也称  
  22.  *            "保存现场"。递归方法的使用的本质是从概念上简化了问题,而不是因为它更有  
  23.  *            效率。当使用递归的效率很低的时候,就可以考虑如果把递归转化成非递归。  
  24.  */  
  25. class OrdArray {   
  26.   
  27.     private long[] a;   
  28.     private int nElems;   
  29.   
  30.     public OrdArray(int max) {   
  31.         a = new long[max];   
  32.         nElems = 0;   
  33.     }   
  34.   
  35.     public int size() {   
  36.         return nElems;   
  37.     }   
  38.   
  39.     public int find(long searchKey) {   
  40.         return recFind(searchKey, 0, nElems - 1);//调用递归方法   
  41.         //return recFind2(searchKey, 0, nElems - 1);//调用非递归方法   
  42.     }   
  43.   
  44.     public int recFind(long searchKey, int lowerBound, int upperBound) {//递归方法定义   
  45.         int curIn = (lowerBound + upperBound) / 2;   
  46.         if (a[curIn] == searchKey) {   
  47.             return curIn;   
  48.         } else if (lowerBound > upperBound) {   
  49.             return nElems;   
  50.         } else {   
  51.             if (a[curIn] < searchKey) {   
  52.                 return recFind(searchKey, curIn + 1, upperBound);   
  53.             } else {   
  54.                 return recFind(searchKey, lowerBound, curIn - 1);   
  55.             }   
  56.         }   
  57.     }   
  58.     public int recFind2(long searchKey, int lowerBound, int upperBound){//非递归方法定义   
  59.         int curIn=0;   
  60.            
  61.         while(true){   
  62.             curIn=(lowerBound+upperBound)/2;   
  63.             if(a[curIn]==searchKey)   
  64.                 return curIn;   
  65.             else if(lowerBound>upperBound)   
  66.                 return nElems;   
  67.             else{   
  68.                 if(a[curIn]<searchKey){   
  69.                     lowerBound=curIn+1;   
  70.                 }   
  71.                 else{   
  72.                     upperBound=curIn-1;   
  73.                 }   
  74.             }   
  75.         }   
  76.     }   
  77.     public void insert(long value){   
  78.         int j;   
  79.         for(j=0; j<nElems; j++)   
  80.             if(a[j]>value)   
  81.                 break;   
  82.         for(int k=nElems; k>j; k--)   
  83.                 a[k]=a[k-1];   
  84.                 a[j]=value;   
  85.                 nElems++;   
  86.     }   
  87.     public void display(){   
  88.         for(int j=0; j<nElems; j++){   
  89.             System.out.println(a[j]+"");   
  90.         }   
  91.     }   
  92. }   
  93. class BinarySearchApp{   
  94.     public static void main(String[] args){   
  95.         int maxSize=100;   
  96.         OrdArray arr=new OrdArray(maxSize);   
  97.            
  98.         arr.insert(72);   
  99.         arr.insert(90);   
  100.         arr.insert(45);   
  101.         arr.insert(126);   
  102.         arr.insert(54);   
  103.         arr.insert(99);   
  104.         arr.insert(144);   
  105.         arr.insert(27);   
  106.         arr.insert(135);   
  107.         arr.insert(81);   
  108.         arr.insert(18);   
  109.         arr.insert(100);   
  110.         arr.insert(9);   
  111.         arr.insert(117);   
  112.         arr.insert(63);   
  113.         arr.insert(36);   
  114.         arr.display();   
  115.            
  116.         int searchKey=100;   
  117.         if(arr.find(searchKey) !=arr.size())   
  118.             System.out.println("Found "+searchKey);   
  119.         else  
  120.             System.out.println("Can't find "+ searchKey);   
  121.     }   
  122. }   
  123. /**  
  124.  * 运行结果:  
  125.  * 9  
  126.  * 18  
  127.  * 27  
  128.  * 36  
  129.  * 45  
  130.  * 54  
  131.  * 63  
  132.  * 72  
  133.  * 81  
  134.  * 90  
  135.  * 99  
  136.  * 100  
  137.  * 117  
  138.  * 126  
  139.  * 135  
  140.  * 144  
  141.  * Found 100  
  142.  */  
  143. /**  
  144.  * 总结:  
  145.  * 很多的数学问题都使用递归的方法解决,比如找两个数的最大公约数,求一个数的  
  146.  * 乘方等等。如果有效率需求的时候,可以再考虑将递归转化成非递归。  
  147.  */  
分享到:
评论

相关推荐

    易语言递归算法2

    递归算法2,正如其名,是递归思想在易语言中的具体应用实例,而辗转相除法(也称欧几里得算法)则是递归算法2的一个典型应用场景。 辗转相除法,源于古希腊数学家欧几里得提出的求最大公约数的方法。该算法基于这样...

    易语言源码递归算法2.rar

    易语言源码中的递归算法2可能涉及到以下几个方面: 1. **基本概念**:首先,理解递归的基本概念至关重要。递归包含两个主要部分:基本情况(Base Case)和递归情况(Recursive Case)。基本情况是指可以直接求解的...

    5!递归算法和非递归算法

    递归算法和非递归算法 在计算机科学与编程领域中,递归算法与非递归算法是两种非常重要的计算方法。本文将详细介绍这两种算法的特点、应用场景以及如何实现它们,特别针对初学者及面试准备者。 #### 递归算法 ...

    VC对磁盘文件遍历搜索的递归算法和非递归算法

    在VC++(Visual C++)环境中,有多种方法可以实现这一目标,其中最常见的是递归算法和非递归算法。这两种方法各有优缺点,适用于不同的场景。 **递归算法**: 递归算法是一种基于函数自身调用解决问题的方法。在...

    .net 递归算法 .net 递归算法.net 递归算法

    在.NET编程环境中,递归算法是一种强大的工具,它允许函数或方法调用自身来解决复杂问题。递归的核心思想是将大问题分解为相同或相似的小问题,直到问题变得足够简单,可以直接得出答案。这种解决问题的方式在数据...

    acm递归算法总结竞赛

    2. **基本原理**:递归算法通常包括两个部分:递归规则(如何将大问题分解为小问题)和终止条件(何时停止递归)。递归规则描述了如何将问题规模减小,而终止条件确保递归不会无限进行下去。 3. **类型**:递归可以...

    abap简单递归算法

    ### ABAP简单递归算法解析 #### 一、引言 ABAP(Advanced Business Application Programming)是一种用于SAP系统的编程语言。它不仅支持传统的过程化编程,还支持面向对象编程和Web开发。本文将深入探讨一个ABAP中...

    汉诺塔问题的非递归算法

    对于解决汉诺塔问题,传统方法是通过递归算法实现,即通过不断将问题规模缩小,直到简化到最基本的情况,然后逐步返回并解决每一层的子问题。然而,递归算法在处理大量圆盘时容易引起调用栈过深,导致效率低下。因此...

    快速排序算法设计与分析总结 二叉树与树的转换前序、后序的递归、非递归算法,层次序的非递归算法的实现

    快速排序算法设计与分析总结 二叉树与树的转换前序、后序的递归、非递归算法,层次序的非递归算法的实现 二叉树与树的转换前序、后序的递归、非递归算法,层次序的非递归算法的实现,应包含建树的实现 实现树与...

    18.递归算法与递归算法应用.ppt

    18.递归算法与递归算法应用.ppt

    递归算法与循环算法的分析

    7. 递归算法和循环算法在斐波那契数列计算中的应用:递归算法的时间复杂度为 O(2^n),循环算法的时间复杂度为 O(n)。 8. 递归算法和循环算法在二分查找算法中的应用:递归算法和循环算法的时间复杂度都为 O(logn),...

    合并排序递归和非递归算法

    2. **执行效率**:递归算法在某些情况下可能导致大量的函数调用,这在效率上可能不如非递归算法。非递归算法通常更直接,没有递归调用的开销。 3. **可读性和实现难度**:递归算法通常代码简洁,易于理解,而非递归...

    递归算法ppt让你快速上手

    "递归算法ppt让你快速上手" 递归算法是计算机科学中的一种重要算法思想,它可以解决许多复杂的问题。下面是递归算法的知识点总结: 1. 递归的定义:若一个对象部分地包含它自己,或用它自己给自己定义,则称这个...

    递归算法专题ppt

    ### 递归算法专题知识点详解 #### 一、递归算法原理 递归算法是一种将问题分解成子问题的方法,其中子问题与原问题性质相同但规模较小。递归算法的关键在于识别出能够通过递归解决的问题,并找到递归的基本情况...

    程序设计中递归算法

    ### 递归算法在程序设计中的应用 #### 一、递归的概念与本质 递归是一种重要的编程思想,在计算机科学和数学领域都有广泛的应用。它指的是一个过程或函数直接或间接地调用自身来解决问题的方法。递归的核心在于将...

    递归算法转为非递归算法

    递归算法转为非递归算法。方法、过程,用栈的原理

    递归算法的详解,各种常见递归算法

    递归算法是一种强大的编程技术,它通过函数或过程在解决问题时调用自身来解决更小规模的相同问题。递归的基本概念在于一个函数在定义中包含对自身的引用,或者问题的解决方案依赖于较小规模问题的解决方案。在程序...

    Hanoi塔问题的一种非递归算法

    ### Hanoi塔问题的一种非递归算法:深入解析与实现 #### 一、引言 Hanoi塔问题作为计算机科学领域内经典的递归问题之一,因其简洁性和挑战性而广受关注。通常,Hanoi塔问题的解决方案多采用递归算法,尽管其逻辑...

    利用递归算法求阶乘(VB6.0源代码)利用递归算法求阶乘

    在这个主题中,我们将深入探讨如何使用递归算法在VB6.0(Visual Basic 6.0)中计算阶乘。VB6.0是Microsoft开发的一款经典可视化编程环境,用于创建Windows应用程序。 阶乘是一个数学概念,表示一个正整数n的所有...

Global site tag (gtag.js) - Google Analytics