我最近在F#的clojure中繞道而過,碰到一個叫做cond的宏。 下面是使用的例子:在F中像cond那樣的clojure#
(cond
(= target (nth arr mid)) mid
(< target (nth arr mid)) (search left (- mid 1))
(> target (nth arr mid)) (search (+ mid 1) right)
(= left right) -1)
這意味着在僞代碼如下:
if target == arr.[mid] then return mid
if target < arr.[mid] then return (call search(left, mid-1))
if target > arr.[mid] then return (call search(mid+1, right))
if left == right then return -1
這僅僅是從的情況下,二進制搜索你想知道什麼是左右和示例中期,但並不重要。
我試圖在F#中找到類似的東西,但是我不能,所以我決定嘗試爲自己寫。 我結束了這樣的事情:
type condition = bool * int
let cond (conds: condition seq) =
conds |> Seq.pick(fun c -> if fst c then Some (snd c) else None)
cond [| ((=) target arr.[mid], mid)
((=) left right, -1)
((<) target arr.[mid], recSrch left (mid-1))
((>) target arr.[mid], recSrch (mid+1) right)
|]
這裏的問題是,我想在一個遞歸函數來使用它,因爲recSrch左(中1)目前正在評估的時候了,所以我在最後一個無限循環。我希望只有在條件成立的情況下才能評估它。另外,這個表格還沒有Clojure那麼幹淨。
任何想法我怎麼能改善這一點?
對於我們這些誰不知道你的Clojure你的問題是非常不透明的。 – ildjarn
對不起,我添加了一些僞代碼來清楚說明clojure代碼的行爲。 –
你可以發佈完整的代碼,包括''target'',''left'',''right''。 – Gustavo