(defun bin-search (obj vec)
(let ((len (length vec)))
(and (not (zerop len))
(finder obj vec 0 (- len 1)))))
;;vec的话,总共两种情况要么even要么odd.
;;finder函数实现的功能就是在vector中查找obj,现在假设obj < obj2,这个时候需要找到左半部分这个vector中查找
;;obj,方式跟前面一样,所以用了递归。
(defun finder (obj vec start end)
(let ((range (- end start)))
(format t "~A~%" (subseq vec start (+ end 1))) ;;注意别放到if闭包呢,
(if (zerop range)
(if (eql obj (aref vec start))
obj
nil)
(let ((mid (+ start (round (/ range 2)))))
(let ((obj2 (aref vec mid)))
(if (< obj obj2)
(finder obj vec start (- mid 1)) ;;值应该在左半部分,所以使end=mid-1
(if (> obj obj2)
(finder obj vec (+ mid 1) end) ;; 值应该在右部分,所以start=mid+1,end不变
obj))))))) ;;当obj=obj2时的情况。
zerop的情况是
1:当只有一个元素时,他可以是本身就一个元素。
2:比如#(1 2 3)查找3的话,第一次mid=2,发现不匹配,然后start就从mid+1 开始,end不变,这个时候你会发现range = 0.然后就判断是否跟obj相等。