二分查找递归版以及书写递归的注意事项

Posted jielearscoding

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分查找递归版以及书写递归的注意事项相关的知识,希望对你有一定的参考价值。

采用递归的方法实现二分查找。

在一个有序数组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
",recursive_bin_ser(list, 1, 4, 100));

 12.30了,就这样吧,碎觉了,又是当工具人的一天!!!

以上是关于二分查找递归版以及书写递归的注意事项的主要内容,如果未能解决你的问题,请参考以下文章

递归函数与二分查找算法

二分查找的递归和非递归写法

第七章 递归函数(续)二分查找算法

2019.9.25-二分查找代码(递归和非递归方法)

递归和非递归的二分查找

二分查找算法(递归与非递归两种方式)