二分查找递归版以及书写递归的注意事项
采用递归的方法实现二分查找。
在一个有序数组list中,从下标1开始,查看target是否在数组中。在的话就返回下标,否则返回0。
思路
1.对线性表排序,通常是由小到大排序。
2.取中间值与目标值比较。
2.1取中间值与目标值比较,若相等,则返回下标,退出函数。
2.2中间值比目标值要大,那么在最小值和中间值之间继续查找,执行2。
2.3中间值比目标值要小,那么在最大值和中间值之间继续查,执行2。
第一版(错误)
int recursive_bin_ser(int* list, int length, int target){ int min = 1, max = length - 1, mid = (min + max) / 2; if(list[mid] == target)return mid; else if(list[mid] < target)return recursive_bin_ser(list+mid + 1,max-mid, target); else return recursive_bin_ser(list, mid-min, target); }
//1.没有处理target不存在的情况。
//2.更要命的是,每一次调用函数,min,max,mid都会被重新初始化,可实际上不是这样的,min,max,mid可能是前一个执行的函数的min,max,mid。
//每调用一次函数,都为这个函数分配局部变量min,max,mid。修正措施,采用参数传递的形式。
第二版
int recursive_bin_ser(int* list, int min , int max , int target){ int mid = (min + max) / 2; while(min <= max){ if(list[mid] == target)return mid; else if(list[mid] < target)return recursive_bin_ser(list, mid + 1, max, target); else return recursive_bin_ser(list ,min, mid -1, target); } return 0; }
//1.我们通过将min,max作为函数参数的形式,在递归执行下一个函数时,就达到了下一个函数可以访问上一个函数的min与max的目的。我觉得以后还是尽量少在递归函数中
//声明变量,一时内存开销大,二是每个函数间的同名的变量容易搞混。
//2.while(min <= max)循环退出时,则表明target没有在list中,因为最后min = max,下一步就是min + 1或者max -1;
int main(){ int list[5] ={ 0,1,2,3,4 }; std::sort(list, list+5);//排序 printf("%d\n",recursive_bin_ser(list, 1, 4, 100));
12.30了,就这样吧,碎觉了,又是当工具人的一天!!!