【问题标题】:Getting a lazy list of the first n items of a lazy list获取惰性列表的前 n 项的惰性列表
【发布时间】:2014-12-03 19:08:08
【问题描述】:

在 Clojure 中,我有一个列表

[a, b, c, d]

我想从中提取一个新的无限元组列表

[ [a,b,c], [b,c,d], [c,d,a], [d,a,b], [a,b,c] ... ]

我试图弄清楚如何使用内置的 seq 函数以纯粹的功能方式做到这一点。

这很简单,我还没有破解吗?或者它实际上是某种难题? (在其他语言中,我会编写自己的循环迭代器并跟踪很多状态。)

更新:另外,为什么有人投票反对?

【问题讨论】:

  • 我认为投反对票是因为你没有展示你到目前为止所做的事情。
  • (take 5 (partition 3 1 (cycle '(a b c d))))
  • 谢谢@Kyle。我不知道 Partition 的三参数版本。
  • @m0skit0 我尝试了很多不同的组合。然后在它们不起作用时将它们扔掉。我假设如果有人知道正确的方法,他们不一定希望或不需要看到我所有失败的尝试。
  • 如果我对此投反对票,那将是因为您的标题与您的问题描述完全不符:从惰性序列中获取前 N 个项目的方法只是 take!阅读您的示例输入+输出,我很困惑试图将其与您的解释相协调。

标签: clojure sequences


【解决方案1】:

这可以使用cyclepartition 的组合来完成

(take 5 (partition 3 1 (cycle '(a b c d))))
;; => ((a b c) (b c d) (c d a) (d a b) (a b c))

【讨论】:

    【解决方案2】:

    不使用分区:

    (defn next-rotation [coll]
      (take (count coll) (drop 1 (cycle coll))))
    
    (defn tuples [n coll]
      (lazy-seq (cons (take n coll) (tuples n (next-rotation coll)))))
    
    ;; (take 5 (tuples 3 '(a b c d))) ;; =>
    ;; ((a b c) (b c d) (c d a) (d a b) (a b c))
    

    【讨论】: