四、递归

  递归是函数调用自身的一种特殊的编程技术,其应用主要在以下几个方面:

     阶乘

   在java当中的基本形式是:

  Public  void  mothed(int n){//当满足某条件时:

  Mothed(n‐1);

  }

  递归二分查找

   Java二分查找实现,欢迎大家提出交流意见.

   /** *名称:BinarySearch

  *功能:实现了折半查找(二分查找)的递归和非递归算法.

  *说明:

  *     1、要求所查找的数组已有序,并且其中元素已实现Comparable<T>接口,如Integer、String等.

  *    2、非递归查找使用search();,递归查找使用searchRecursively();

  *

  *本程序仅供编程学习参考

   *

   *@author:   Winty

  *@date:     2008-8-11

  *@email:    [email]wintys@gmail.com[/email]

*/

class BinarySearch<T extends Comparable<T>> {

   private T[]  data;//要排序的数据

  public BinarySearch(T[] data){

  this.data = data;

  }

   public int search(T key){

  int low;

  int high;

  int mid;

  if(data == null){

   return -1;

  }

  low = 0;

  high = data.length - 1;

  while(low <= high){

  mid = (low +high) / 2;

  System.out.println("mid " + mid + " mid value:" + datamid]);///

   if(key.compareTo(data[mid]) <0){

  high = mid - 1;

  }else if(key.compareTo(data[mid]) > 0){

  low = mid + 1;

   }else if(key.compareTo(data[mid]) == 0){

  return mid;

  }

  }

   return -1;

  }

   private int doSearchRecursively(int low , int high , T key){

  int mid;

  int result;

  if(low <= high){

  mid = (low + high) / 2;

  result = key.compareTo(data[mid]);

  System.out.println("mid " + mid + " mid value:" + data[mid]);///

  if(result < 0){

  return doSearchRecursively(low , mid - 1 , key);

  }else if(result > 0){

   return doSearchRecursively(mid + 1 , high , key);

  }else if(result == 0){

  return mid;

  }

  }

   return -1;

  }

public int searchRecursively(T key){

  if(data ==null)return -1;

  return doSearchRecursively(0 , data.length - 1 , key);

  }

  public static void main(String[] args){

  Integer[] data = {1 ,4 ,5 ,8 ,15 ,33,48 ,77 ,96};

  BinarySearch<Integer> binSearch = new  BinarySearch<Integer>(data);  //System.out.println("Key index:" + binSearch.search(33) );

  System.out.println("Key index:" + binSearch.searchRecursively(3) );

  //String [] dataStr = {"A" ,"C" ,"F" ,"J" ,"L" ,"N" ,"T"};

  //BinarySearch<String> binSearch = new BinarySearch<String>(dataStr);

  //System.out.println("Key index:" + binSearch.search("A") );

    }

  }

  递归排序

   其实在数组的全排序中完全可以使用更加易懂简便的写法——for循环,但是通过for循环编写数组全排序需要有一个先决条件——知道数组全排序的个数,因为有n个数据全排序就需要写n个嵌套for循环。因此在写全排序时一般使用递归方法。这就是我的第一个关于递归排序的见解——递归排序可以无需已知排序数组的长度,即排序个数!

  其二,不管是使用递归进行数组排序还是使用for循环进行数组的排序,它们都是本质都是使用枚举,因此可以得出这样一个结论:枚举可以确保找出每一种可能的排序规则!     

  其三,枚举是列出所有的方法并找出符合要求的算法,因此其算法效率一定比较的低,需要对其进行优化,才能达到较好的效果(递归的时候排除所有不可能的方案)

  消除递归

  消除递归的基本思路是用栈来模拟系统的函数调用从而消除递归。基本上要做以下三件事:

  传递参数(包括返回地址)并转到函数入口;

  获得参数并处理参数;

  根据传入的返回地址;

返回

Java数据结构和算法之递归的更多相关文章

  1. JAVA数据结构和算法 6 递归

    递归:直接或者间接地调用自己.比如计算连续数的阶乘,计算规律:n!=(n-1)!*n. 每个递归方法都有一个基值(终止)条件,以防止无线地递归下去,以及由此引发的程序崩溃. 采用递归是因为它可以从概念 ...

  2. Java数据结构和算法 - 递归

    三角数字 Q: 什么是三角数字? A: 据说一群在毕达哥拉斯领导下工作的古希腊的数学家,发现了在数学序列1,3,6,10,15,21,……中有一种奇特的联系.这个数列中的第N项是由第N-1项加N得到的 ...

  3. Java数据结构和算法(九)——高级排序

    春晚好看吗?不存在的!!! 在Java数据结构和算法(三)——冒泡.选择.插入排序算法中我们介绍了三种简单的排序算法,它们的时间复杂度大O表示法都是O(N2),如果数据量少,我们还能忍受,但是数据量大 ...

  4. Java数据结构和算法 - 堆

    堆的介绍 Q: 什么是堆? A: 这里的“堆”是指一种特殊的二叉树,不要和Java.C/C++等编程语言里的“堆”混淆,后者指的是程序员用new能得到的计算机内存的可用部分 A: 堆是有如下特点的二叉 ...

  5. Java数据结构和算法 - 二叉树

    前言 数据结构可划分为线性结构.树型结构和图型结构三大类.前面几篇讨论了数组.栈和队列.链表都是线性结构.树型结构中每个结点只允许有一个直接前驱结点,但允许有一个以上直接后驱结点.树型结构有树和二叉树 ...

  6. Java数据结构和算法 - 高级排序

    希尔排序 Q: 什么是希尔排序? A: 希尔排序因计算机科学家Donald L.Shell而得名,他在1959年发现了希尔排序算法. A: 希尔排序基于插入排序,但是增加了一个新的特性,大大地提高了插 ...

  7. Java数据结构和算法(五)--希尔排序和快速排序

    在前面复习了三个简单排序Java数据结构和算法(三)--三大排序--冒泡.选择.插入排序,属于算法的基础,但是效率是偏低的,所以现在 学习高级排序 插入排序存在的问题: 插入排序在逻辑把数据分为两部分 ...

  8. Java数据结构和算法(六)--二叉树

    什么是树? 上面图例就是一个树,用圆代表节点,连接圆的直线代表边.树的顶端总有一个节点,通过它连接第二层的节点,然后第二层连向更下一层的节点,以此递推 ,所以树的顶端小,底部大.和现实中的树是相反的, ...

  9. Java数据结构和算法

    首先,本人自学java,但是只学习了java的基础知识,所以想接下来学习一下数据结构和算法,但是找了很多教材,大部分写的好的都是用c语言实现的,虽然知道数据结构和算法,跟什么语言实现的没有关系,但是我 ...

随机推荐

  1. [Oracle] SQL*Loader 详细使用教程(3)- 控制文件

    控制文件是SQL*Loader里最重要的文件,它是一个文本文件,用来定义数据文件的位置.数据的格式.以及配置数据加载过程的行为,在sqlldr中以control参数指定控制文件.   在控制文件里配置 ...

  2. Linux 笔记总览

    LInux 性能分析 Linux IO实时监控命令详解

  3. 转:[置顶] 从头到尾彻底理解KMP(2014年8月22日版)

    [置顶] 从头到尾彻底理解KMP(2014年8月22日版)

  4. 【转】pycharm快捷键、常用设置、包管理

    转自:pycharm快捷键.常用设置.包管理 在PyCharm安装目录 /opt/pycharm-3.4.1/help目录下可以找到ReferenceCard.pdf快捷键英文版说明 or 打开pyc ...

  5. E:Sudoku

    总时间限制: 2000ms 内存限制: 65536kB描述Sudoku is a very simple task. A square table with 9 rows and 9 columns ...

  6. spring mvc 注解 学习笔记(一)

    以前接触过spring,但是没有接触spring mvc 以及注解的应用,特习之,记之: 注解了解 @Component 是通用标注, @Controller 标注web控制器, @Service 标 ...

  7. javascript思维导图

    JavaScript 数组 JavaScript 函数基础 Javascript 运算符 JavaScript 流程控制 JavaScript 正则表达式 JavaScript 字符串函数 JavaS ...

  8. 如何替换掉.net toolStrip控件溢出按钮背景图

    在使用.net toolStrip控件的时候,  toolStrip里面的item宽度超过本身宽度时,会出现一个溢出按钮:OverflowButton,这个按钮是控件的一个属性,其实也是继承自Tool ...

  9. WCF初探-16:WCF数据协定之基础知识

    数据协定概念 “数据协定”是在服务与客户端之间达成的正式协议,用于以抽象方式描述要交换的数据. 也就是说,为了进行通信,客户端和服务不必共享相同的类型,而只需共享相同的数据协定. 数据协定为每一个做数 ...

  10. OC面向对象—继承

    OC面向对象—继承 一.基本概念 程序的世界和人类的“对象”世界在思想上是没有设么区别的,富二代继承了父母,自然就拥有了父母拥有的所有资源,子类继承了父类同样就拥有了父类所有的方法和属性(成员变量). ...