在LISP中使用“灰”来执行二分搜索?
所以,我现在正在阅读Lisp的Land,而Lisp与我见过的其他编程语言相比已经非常不同了。
无论如何,本书提供了一些我们打算进入CLISP REPL的代码:
(defparameter *small* 1)
(defparameter *big* 100)
(defun guess-my-number ()
(ash (+ *small* *big*) -1))
(defun smaller ()
(setf *big* (1- (guess-my-number)))
(guess-my-number))
(defun bigger ()
(setf *small* (1+ (guess-my-number)))
(guess-my-number))
现在,基本目标是创建一个数字猜测游戏,其中用户/玩家选择一个数字,然后计算机试图猜测数字。 它通过让玩家报告计算机猜测的数字是高于还是低于玩家的号码来执行“二分搜索”以找到玩家的号码。
我对ash
功能有点困惑。 我的理解是这对于二分查找很重要,但我不确定为什么。 这本书稍微解释了它的作用,但它有点令人困惑。
什么是ash
功能呢? 为什么它通过*small*
参数添加到*big*
和-1
? 它是如何工作的? 它对二进制搜索有什么用途?
谷歌给你这个页面,它解释了ash
是算术移位操作。 所以(ash x -1)
将x
向右移一位,因此给出其整数的一半。
感谢Basile Starynkevitch在这一方面的帮助......
总之, ash
执行算术移位操作。
在(ash x -1)
的情况下,它将x
向右移一位,最终返回整数的一半。
例如,考虑二进制数字1101
。 二进制中的1101
相当于十进制中的13
,可以这样计算:
8 * 1 = 8
4 * 1 = 4
2 * 0 = 0
1 * 1 = 1
8 + 4 + 0 + 1 = 13
运行(ash 13 -1)
会看的13二进制表示,并执行-1算术移位,通过1。这所有位向右移位将产生的二进制输出110
(斩去1
在原始号码的结尾)。 二进制中的110
等于十进制中的6
,可以这样计算:
4 * 1 = 4
2 * 1 = 2
1 * 0 = 0
4 + 2 + 0 = 6
现在,13除以2不等于6,它相当于6.5,但是,因为它将返回整数的一半,所以6是可接受的答案。
这是因为二进制是基数2。
链接地址: http://www.djcxy.com/p/60945.html