我实施了会员?在clojure中的功能如下:
(defn member? [item seq]
(cond (empty? seq) false
(= item (first seq)) true
:else (recur item (rest seq))))
不幸的是,这不适用于无限列表。有没有人知道实现它的方法,以便能够得到:
(member? 3 (range)) -> true
答案 0 :(得分:1)
对于无限输入序列,您的实现行为正确。在找到元素之前它不会终止,因为(empty? seq)
情况永远不会下降。
考虑在无限空间中搜索某些东西。什么时候该说它不存在呢?没有可靠的方法来判断。限制您搜索的空间,例如: G:
(member? 3 (take 10 (range)))
答案 1 :(得分:1)
为了确保没有特定元素,您需要遍历整个集合。然后,只有这样你才能保证它不存在。
在某些情况下,例如您的示例,输入序列是升序的,i。即序列中的每个元素都小于其后续元素。您可以利用它并使您的序列有限using take-while
:
(member? 3 # is 3 a member of
(take-while # a sequence of elements
#(<= % 3) # up to 3 inclusively
range)) # from range
答案 2 :(得分:0)
对我来说,您的代码已经有效:(member? 3 (range))
会返回true
。
但是检查无限序列中是否存在值有什么意义呢?它将返回true或永远不会返回。