会员?在无限列表上运行

时间:2015-10-25 10:21:39

标签: recursion clojure lazy-evaluation

我实施了会员?在clojure中的功能如下:

(defn member? [item seq]
  (cond (empty? seq) false
        (= item (first seq)) true
        :else (recur item (rest seq))))

不幸的是,这不适用于无限列表。有没有人知道实现它的方法,以便能够得到:

(member? 3 (range)) -> true

3 个答案:

答案 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或永远不会返回。