递归和查找
二分查找
1、二分查找
对待搜索序列进行的每一次查找,如果没有查找到目标,就将带搜索序列折半,对其中一半的序列进行查找,直到找到目标元素在待搜索序列中的下标,将下标进行返回。
2、二分查找,查的是什么??
二分查找的搜索目标并不是目标元素本身,而是目标元素在待搜索序列中的下标。
二分查找的前提条件:待搜索序列的所有元素必须是有序的
3、二分查找代码实现
public int binarySearch(int[] array,int target){
//定义搜索序列否起点下标,终点下标,中间下标
int s=0;
int e=array.length-1;
int m=(s+e)/2;
do{
m=(s+e)/2;
if(target<array[m]){
e=m-1;
}
if(target>array[m]){
s=m+!;
}
if(target==array[m]){
return m;
}
}while(s<=e);
return -1;
}
递归
递归调用
指的就是在同一个方法内部再次调用自己的过程,即大事化小;最小问题为递归出口,即小事化了。
死递归:没有递归出口或者永远执行不到。
eg:求1+2+3+…+n-1+n的和
public int add(int n){
if(n==1){
return 1;
}else{
return n+add(n-1);
}
}
求n的阶乘
public int result(int n){
if(n==1){
return 1;
}else{
return n*result(n-1);
}
}
斐波那契数列
public int fibonacci(int n){
if(n==1||n==2){
return 1;
}else{
return fibonacci(n-1)+fibonacci(n-2);
}
}
在同一个递归方法中,递归调用和递归出口的数量不一定只有一个
使用递归实现的二分查找
public int dg(int[]array,int target,int start,int end){
if(start>end){
return -1;
}
int m=(start+end)/2;
if(target<array[m]){
return dg(array,target,start,m-1);
}else if(target>array[m]){
return dg(array,target,m+1,end);
}else{
return m;
}
}