递归算法
优点
递归是非常有效的算法实现形式,在小规模运算的情况下是很有效的,代码直观。
经典的二分查找算法的递归实现如下:
public static int rank3(int key ,int[] a){
return rank3(key,a,0,a.length -1);
}
/**递归的要点:
* 1:递归总有一个最简单的情况,方法的第一句总是包含一个带条件的返回语句
* 2 递归调用总是收缩的,尝试解决一个规模更小的问题,这样递归才能收敛到最简单的情况
* 3:递归调用的父问题和尝试解决的子问题之间不应该有交集
*/
public static int rank3(int key,int[] a,int low,int hi){
if(low>hi) return -1;
int mid = low + (hi-low)/2;
if(key>a[mid]){low = mid+1; return rank3(key,a,low,hi);}
else if(key<a[mid]){hi = mid -1; return rank3(key,a,low,hi);}
else {
return mid;
}
}
return rank3(key,a,0,a.length -1);
}
/**递归的要点:
* 1:递归总有一个最简单的情况,方法的第一句总是包含一个带条件的返回语句
* 2 递归调用总是收缩的,尝试解决一个规模更小的问题,这样递归才能收敛到最简单的情况
* 3:递归调用的父问题和尝试解决的子问题之间不应该有交集
*/
public static int rank3(int key,int[] a,int low,int hi){
if(low>hi) return -1;
int mid = low + (hi-low)/2;
if(key>a[mid]){low = mid+1; return rank3(key,a,low,hi);}
else if(key<a[mid]){hi = mid -1; return rank3(key,a,low,hi);}
else {
return mid;
}
}
递归的缺点:
递归主要利用栈内存进行计算,java 的栈内存是有限制的。可通过下面两个方式进行控制
public Thread(ThreadGroup group, Runnable target, String name,
long stackSize) {
init(group, target, name, stackSize);
}
当然也可以通过JVM启动参数来指定。XX:ThreadStackSize=<value>:设置线程的栈大小(字节数)(0表示 默认) [Sparc: 512, Solaris Intel: 256, Sparc 64bit: 1024 all others 0]
递归的优化
参见博客:http://www.cnblogs.com/wb-DarkHorse/archive/2013/11/15/3284228.html