• 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]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循环进行数组的排序,它们都是本质都是使用枚举,因此可以得出这样一个结论:枚举可以确保找出每一种可能的排序规则!     

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

      消除递归  

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

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

      获得参数并处理参数;

      根据传入的返回地址;

    返回

  • 相关阅读:
    Mybatis基础最后一篇。缓存,实体类序列化(例子:public class User implements Serializable)
    Mybatis基础 lombok插件常用注解(待更)
    mysql面试题,主从复制,读写分离
    Java并发编程实战笔记—— 并发编程1
    Redis——发布和订阅
    Redis——基础使用
    javacv——读取摄像头的图像、截取视频的画面
    LeetCode——372. Super Pow
    Java——数组
    Java——擦除
  • 原文地址:https://www.cnblogs.com/amirsterry/p/3704172.html
Copyright © 2020-2023  润新知