Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Recursion 递归地跟踪哈希映射clojure中的值_Recursion_Clojure_Hashmap - Fatal编程技术网

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