gpt4 book ai didi

lisp - 具有更高级别功能的 lisp 中的二进制搜索

转载 作者:太空宇宙 更新时间:2023-11-03 18:50:20 25 4
gpt4 key购买 nike

我正在尝试编写一个(高阶函数),它接受一个向量和一个函数,并根据该函数进行二进制搜索,即如果它返回 -1,我们需要降低,对于 1 - 更高,对于 0,我们找到了正确的位置。我想到了这样的事情,但似乎我在将函数作为参数传递时做错了:

(defun bin-search (ls fpred)
(let ((l (length ls))
(x (aref ls (floor (length ls) 2))))
(labels (binsearch (ls fpred l m)
(case (funcall #'fpred (aref ls m))
(-1 (binsearch (ls fpred l (floor (- m l) 2))))
(0 (return-from binsearch m))
(1 (binsearch (ls fpred m (+ m (floor (- m l) 2)))))))
(binsearch ls fpred 0 l))))

编译器说变量 FPRED 已定义但从未使用过。怎么了?

最佳答案

(defun bin-search (ls fpred)

请使用有意义的名称,您有很多短名称或缩写,难以阅读。例如,ls让我想到一个列表,可以简单地命名为 list , 但显然你正在使用矢量,所以也许 vecvector

 (let ((l (length ls))
(x (aref ls (floor (length ls) 2))))

如果要重用长度l在同一个 let 中定义,你可以使用 let*相反,写 l而不是第二次出现 (length ls) .

       (labels (binsearch (ls fpred l m)

标签的语法是绑定(bind)的列表 (name (<args>) <body>) ,因此您需要添加另一对括号,例如 (labels ((binsearch (<args>) <body>)) ...

此外,您不需要传递 fpred作为参数,它不会因一次调用而改变 binsearch给另一个。可以引用bin-searchfpred来自本地函数内部的参数。

                (case (funcall #'fpred (aref ls m))

当你写 #'fpred ,相当于 (function fpred) ,您正在寻找fpred函数命名空间中。此处您要访问与名为 fpred变量 关联的函数, 所以你可以删除 #'部分。

                 (-1 (binsearch (ls fpred l (floor (- m l) 2))))

当你写 (binsearch (ls fpred ...)) ,这意味着:调用 binsearch有一个值,通过调用函数 ls 获得带参数 fpred , ...。括号很重要,您需要在此处将其删除。

                 (0 (return-from binsearch m))
(1 (binsearch (ls fpred m (+ m (floor (- m l) 2)))))))
(binsearch ls fpred 0 l))))

关于lisp - 具有更高级别功能的 lisp 中的二进制搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52743064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com