最近有个读者朋友在我的技术交流群问了一个关于二分查找的问题,具体题目如下。
如果你是第一次接触这个问题,能够写出答案,那我觉得你堪称天才了。
接触过这个问题的朋友对解决方案可以脱口而出,使用二分查找。计算机科班出身的同学在教科书上已经学习过二分查找的算法了,在一个已经排好序的无重复数值的数组寻找某个数。但是当我们着手解决各种二分查找算法问题时,经常会写出死循环和数组越界的代码。
网上有不少二分查找的模板,可以分为三大类。
三个模板,记忆力再好,也有可能初一记得,十五就忘了。有没有一套模板就能搞定的呢?还真让我在bilibili上找到了。代码很简单,比教科书上找某个确定值还要简单。
二分查找为什么总是写错?
https://www.bilibili.com/video/BV1d54y1q7k7
视频上的弹幕基本都是,牛逼,厉害,完美之类的赞叹。颇有几分相见恨晚的意思,更有几分要是早有人告诉这么解二分查找的问题,我就不会丢分之类的感觉。
但是思路好归好,你一个籍籍无名的B站up主的算法思路,无法不让人产生怀疑。效率能行吗?解法主流吗?能否经得起各种case的考验
结果有一天我在medium上发现了kotlin项目leader发的一篇类似的文章。内容几乎一样。有了大佬的加持,我深信这套代码没问题,肯定不是无中生有的了。
最后在评论区发现了一个知识盲区,tail recursion,一个读者用递归的形式解决了这个问题,然后用了kotlin的特性 tailrec将递归转成迭代方式
然后我找到了关于尾部递归的资料,大家感兴趣可以看看。