binary search

本文详细介绍了二分查找算法的实现原理及递归过程。通过定义的finder函数,在有序vector中查找目标值obj,并根据比较结果调整搜索范围,直至找到目标值或确定目标值不存在于vector中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(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相等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值