什么是递归。以编程的角度来看,程序调用自身的编程技巧称为递归( recursion)。
百度百科中的解释是这样的:递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
1、递归的定义
递归,就是在运行的过程中调用自己。
递归必须要有三个要素:
①、边界条件
②、递归前进段
③、递归返回段
当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
2、求一个数的阶乘:n!
1
n! = n*(n-1)*(n-2)*......1
规定:
①、0!=1
②、1!=1
③、负数没有阶乘
上面的表达式我们先用for循环改写:
/**
* 0!=1 1!=1
* 负数没有阶乘,如果输入负数返回-1
* @param n
* @return
*/
public static int getFactorialFor(int n){
int temp = 1;
if(n >=0){
for(int i = 1 ; i <= n ; i++){
temp = temp*i;
}//需要获取资料的朋友请加Q君样:290194256*
}else{
return -1;
}
return temp;
}
如果求阶乘的表达式是这样的呢?
1
n! = n*(n-1)!
我们用递归来改写:
/**
* 0!=1 1!=1
* 负数没有阶乘,如果输入负数返回-1
* @param n
* @return
*/
public static int getFactorial(int n){
if(n >= 0){
if(n==0){
System.out.println(n+"!=1");
return 1;
}else{
System.out.println(n);
int temp = n*getFactorial(n-1);
System.out.println(n+"!="+temp);
return temp;
}//需要获取资料的朋友请加Q君样:290194256*
}
return -1;
}
我们调用该方法getFactorial(4);即求4!打印如下:
这段递归程序的边界条件就是n==0时,返回1,具体调用过程如下:
3、递归的二分查找
注意:二分查找的数组一定是有序的!!!
在有序数组array[]中,不断将数组的中间值(mid)和被查找的值比较,如果被查找的值等于array[mid],就返回下标mid; 否则,就将查找范围缩小一半。如果被查找的值小于array[mid], 就继续在左半边查找;如果被查找的值大于array[mid], 就继续在右半边查找。 直到查找到该值或者查找范围为空时, 查找结束。
不用递归的二分查找如下:
/**
* 找到目标值返回数组下标,找不到返回-1
* @param array
* @param key
* @return
*/
public static int findTwoPoint(int[] array,int key){
int start = 0;
int last = array.length-1;
while(start <= last){
int mid = (last-start)/2+start;//防止直接相加造成int范围溢出
if(key == array[mid]){
//查找值等于当前值,返回数组下标
return mid;
}
if(key > array[mid]){
//查找值比当前值大
start = mid+1;
}
if(key < array[mid]){
//查找值比当前值小
last = mid-1;
}
}
return -1;
}
二分查找用递归来改写,相信也很简单。边界条件是找到当前值,或者查找范围为空。否则每一次查找都将范围缩小一半。
public static int search(int[] array,int key,int low,int high){
int mid = (high-low)/2+low;
if(key == array[mid])