先谈一下什么是递?什么是归?
递:深入到最里层叫递
归:从最里层出来叫归
递归的含义?
(1)每次调用自己,如果说每个函数对应着一种解决方案,自己调用自己意味着解决方案是一样的(按我理解就是俄罗斯套娃)
(2)每次调用,函数处理的数据较上次缩减,而且最后会缩减至无需继续递归(简单来说就是规模缩减)
(3)内层函数调用完成,外层函数才能算调用完成
//举个单链表递归遍历的例子
void f(Node node){
if(node == null) { //node == null 是递归的结束条件
return;
}
println(node.value)
f(node.next);
}
/**
代码只是便于你理解,你可以试一下把f(1),f(2),f(3)代入
它的内部可以说是循环套娃
*/
先来看看普通方法来解决二分查找
(题目先摆上)
class Solution {
public int search(int[] nums, int target) { //target是待查找值
int i=0,j=nums.length-1; //i是左边界,j是右边界
while(i <= j){
int m = (i+j)/2;
if(target == nums[m]){
return m;
}else if(target < nums[m]){
j = m - 1;
}else {
i = m + 1;
}
}
return -1;
}
}
使用递归来解决二分查找
class Solution { //用递归来做
public int search (int[] arr, int target) {
return f(arr,target,0,arr.length-1);
}
public static int f(int[] arr, int target,int i,int j) {
if(i>j){
return -1;
}
int m = (i+j)>>>1;
if(target<arr[m]){
return f(arr,target,i,m-1);
}else if(target>arr[m]){
return f(arr,target,m+1,j);
}else{
return m;
}
}
}