vlambda博客
学习文章列表

2021/8/23非递归二分查找法填坑,递归形式二分查找法

昨天弄非递归形式的二分查找法的时候,发现如果输入一个数,在被查找数组里没有的时候,如果这个数比数组里的所有数都大,那么会返回数组最大下标+1,如果比所有数都小,返回0,还有一个是如果返回的数在数组范围内的情况


前两个都在昨晚按流程走一遍了,今天走一下昨晚最后那个(处在这个数组的范围内的,数组没有这个数的)


初步看了一下,发现这个GitHub的作者写的程序好像有一点不太严谨


作者这里把情况分为了三种,一个是num[mid]<key,一个是num[mid]>key,另一个就是else了(按目前来看,应该就只有num[mid]==key才可以执行else)

按key=17来走一下流程

mid=0+9/2

      =0+4

      =4

num[4]=15

15<17

low=4+1=5


mid=5+(9-5)/2

       =7

num[7]=25


25>17

high=7-1=6


mid=5+(6-5)/2

      =5

num[5]=18

18>key17

high=6-1=5


现在low=high=5了,再走一轮,因为现在mid也是5,所以还是18>17的情况,也就是说high变成4会结束循环

return low;

得到的就是5


这个二分查找法好像有点问题呀....


然后是看看递归形式的二分查找法

说实在的,我还真不知道为啥要叫递归形式的

这个是源码

这个源码里把search方法设了四个参数,数组、low、high跟关键值key

然后把原先非递归形式里的while循环改成了一个递归调用

return再走一遍这个search函数


好像就是把while循环换成了递归....

这样好像比较高级一点?是不是也更省性能呢?日后回来填坑填坑


稍微查了一下递归跟循环,涉及到了好多数据结构的东西,有一点看不懂...

另外还有一个叫迭代的知识点


稍微查了一下CSDN上的资料

https://blog.csdn.net/u013001137/article/details/90116054?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162972265016780274197182%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162972265016780274197182&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v29_ecpm-1-90116054.first_rank_v2_pc_rank_v29&utm_term=%E9%80%92%E5%BD%92%E8%B7%9F%E5%BE%AA%E7%8E%AF%E5%8C%BA%E5%88%AB&spm=1018.2226.3001.4187


稍微做一个简单一点的总结

相同点:递归跟循环都是针对需要重复地多次计算相同的问题

不同点:

1.递归是在一个函数的内部调用这个函数本身

2.循环是通过设置计算的初始值及终止条件,在一个范围内重复计算

3.递归相对来说要用的语句比较少

4.在树的前序中序后序遍历算法的代码中,递归的实现方式也比循环简单得多而且更容易实现


面试的时候尽量用递归,如果面试官没有特别要求的话


递归的缺点: