递归
来源:互联网 发布:依云软件 编辑:程序博客网 时间:2024/06/08 06:35
递归是函数调用自身的一种特殊的编程技术,其应用主要在以下几个方面:
阶乘
在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:" + data[mid]);///
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当中的基本形式是: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:" + data[mid]);///
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循环进行数组的排序,它们都是本质都是使用枚举,因此可以得出这样一个结论:枚举可以确保找出每一种可能的排序规则!
其三,枚举是列出所有的方法并找出符合要求的算法,因此其算法效率一定比较的低,需要对其进行优化,才能达到较好的效果(递归的时候排除所有不可能的方案)
消除递归
消除递归的基本思路是用栈来模拟系统的函数调用从而消除递归。
基本上要做一下三件事:传递参数(包括返回地址)并转到函数入口;获得参数并处理参数;根据传入的返回地址返回
0 0
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- @ManyToMany
- 18.通过按键切换LED颜色
- 从零开始学习CocosBuilder
- 第一篇 微信商城 开发前的准备工作
- Symbol 'ANDROID_LOG_DEBUG' could not be resolved
- 递归
- 搜索引擎 url 提交入口网址
- vC2010应用程序的控件风格与设计时显示一致解决方案
- 面试中常考的EJB知识以及Weblogic知识
- 消息称被撤职政协委员刘迎霞卷入中石油腐败窝案
- SOCK_RAW PF_PACKET IPv6带物理地址发送报文
- UVA 11090 Going in Cycle!!(二分 + spfa 判负环)
- MFC 移动控件到指定位置
- 【Android UI设计与开发】第17期:滑动菜单栏(二)开源项目SlidingMenu的示例