Java数据结构和算法之递归

  四、递归

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

     阶乘

   在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][email protected][/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数据结构和算法之递归,布布扣,bubuko.com

时间: 2024-10-19 01:16:45

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

java数据结构与算法之递归思维(让我们更通俗地理解递归)

[版权申明]转载请注明出处(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53452971 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈(Stack)设计与实现 j

java数据结构与算法之平衡二叉树(AVL树)的设计与实现

[版权申明]未经博主同意,不允许转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53892797 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈(Stack)设

java数据结构与算法之树基本概念及二叉树(BinaryTree)的设计与实现

[版权申明]未经博主同意,不允许转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53727333 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈(Stack)设

数据结构与算法5: 递归(Recursion)

数据结构与算法5: 递归(Recursion) 写在前面 <软件随想录:程序员部落酋长Joel谈软件>一书中<学校只教java的危险性>一章提到,大学计算机系专业课有两个传统的知识点,但许多人从来都没搞懂过,那就是指针和递归.我也很遗憾没能早点熟练掌握这两个知识点.本节一些关键知识点和部分例子,都整理自教材或者网络,参考资料列在末尾.如果错误请纠正我. 思考列表: 1)什么程序具有递归解决的潜质? 2)递归还是非递归算法,怎么选择? 3)递归程序构造的一般模式 1.递归定义 首要引

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

春晚好看吗?不存在的!!! 在Java数据结构和算法(三)——冒泡.选择.插入排序算法中我们介绍了三种简单的排序算法,它们的时间复杂度大O表示法都是O(N2),如果数据量少,我们还能忍受,但是数据量大,那么这三种简单的排序所需要的时间则是我们所不能接受的.接着我们在讲解递归 的时候,介绍了归并排序,归并排序需要O(NlogN),这比简单排序要快了很多,但是归并排序有个缺点,它需要的空间是原始数组空间的两倍,当我们需要排序的数据占据了整个内存的一半以上的空间,那么是不能使用归并排序的. 本篇博客将

Java数据结构和算法(二)树的基本操作

Java数据结构和算法(二)树的基本操作 一.树的遍历 二叉树遍历分为:前序遍历.中序遍历.后序遍历.即父结点的访问顺序 1.1 前序遍历 基本思想:先访问根结点,再先序遍历左子树,最后再先序遍历右子树即根-左-右.图中前序遍历结果是:1,2,4,5,7,8,3,6. // 递归实现前序遍历 public void preOrder() { System.out.printf("%s ", value); if (left != null) { left.preOrder1(); }

Java数据结构和算法(二)——数组

数组的用处是什么呢?--当你需要将30个数进行大小排列的时候,用数组这样的数据结构存储是个很好的选择,当你是一个班的班主任的时候,每次要记录那些学生的缺勤次数的时候,数组也是很有用.数组可以进行插入,删除,查找等. 1)创建和内存分配 Java中有两种数据类型,基本类型和对象类型,也有人称为引用类型,Java中把数组当成对象,创建数组时使用new操作符. int array[] = new int[10]; 既然是对象,那么array便是数组的一个引用,根据Java编程思想(一) -- 一切都是

Java数据结构与算法之集合

线性表.链表.哈希表是常用的数据结构,在进行Java开发时,SDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中. 一.Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object.一些Collection允许相同元素而另一些不行.一些能排序而另一些不行.Java  SDK不提供直接继承自Collection的类,Java  SDK提供的类都是继承自Collection的"子接口"如List和Set

Java数据结构和算法之栈与队列

二.栈与队列 1.栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表. (1)通常称插入.删除的这一端为栈顶(Top),另一端称为栈底(Bottom). (2)当表中没有元素时称为空栈. (3)栈为后进先出(Last In First Out)的线性表,简称为LIFO表. 栈的修改是按后进先出的原则进行. 每次删除(退栈)的总是当前栈中"最新"的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,要到最后才能删除. 图1 [示例]元素是以a1,a2,-,a