Recursion 递归地跟踪哈希映射clojure中的值
我在为下面的递归函数提供边缘情况时遇到了一个问题,该函数搜索哈希映射和其他类似的键、值存储Recursion 递归地跟踪哈希映射clojure中的值,recursion,clojure,hashmap,Recursion,Clojure,Hashmap,我在为下面的递归函数提供边缘情况时遇到了一个问题,该函数搜索哈希映射和其他类似的键、值存储 (def hashbrownies {"Mary","Dave" "Dave","Anne" "Anne","Tim"}) 当前方法 (defn recursive-lookup [key-lst search-func conditional] (let [next-key (search-func (first key-lst))] (if (conditional
(def hashbrownies
{"Mary","Dave"
"Dave","Anne"
"Anne","Tim"})
当前方法
(defn recursive-lookup
[key-lst search-func conditional]
(let [next-key (search-func (first key-lst))]
(if (conditional next-key)
(reverse key-lst)
(recur (cons next-key key-lst) search-func conditional))))
有效的例子
>> (recursive-lookup ["Mary"] #(hashbrownies %) (partial = nil))
=> ("Mary" "Dave" "Anne" "Tim")
>> (recursive-lookup ["Mary"] #(hashbrownies %) #(< (.length %) 4))
=> ("Mary" "Dave" "Anne")
我可以看出问题是什么:由于无法满足条件,函数#(.length%)4
将nil
(最后可能的返回值)作为参数。但作为Clojure的新手,我不知道如何弥补这一点。有惯用的方法吗
解决方案:
(defn recursive-lookup
[key-lst search-func conditional]
(let [next-key (search-func (first key-lst))]
(if (or (nil? next-key)
(conditional next-key))
(reverse key-lst)
(recur (cons next-key key-lst) search-func conditional))))
您需要在条件函数中处理
nil
。你可以用它fnil
用一些默认值替换nil。因此,您可以尝试:
(fnil #(> (.length %) 4) "")
如果此条件函数接收到nil
,它会将nil
替换为空字符串“”,然后调用函数#(.length%)4
您也可以使用count
代替.length
。计数返回0表示为零:
(count "123") => 3
(count nil) => 0
很好,但是如果我得到一个默认值或0,那么函数将把它添加到列表中并再次调用它自己,堆空间将耗尽。我想我需要更改main函数以返回任何nil的列表。可能是一个
case
语句?是的,我认为您需要修改主函数。您可以将条件添加到if
:(if(或(nil?next key)(条件next key))…)
(count "123") => 3
(count nil) => 0