2024 年 Clojure 状态调查中分享您的想法!

欢迎!请查看关于页面了解关于这个网站的一些更多信息。

0
集合

我想创建一个成对的列表,最佳方式是作为一系列成对元素的成对。

(for [ni (range n)
          di (range d)]
     (let [j1 (mod (inc di) n)
              j2 (mod (- n (inc di)) n) ]
          (conj [] [ni j1] [ni j2]) ))

这让我接近目标

([[0 1] [0 9]] [[0 2] [0 8]] [[1 1] [1 9]]...

但这似乎多了一个象括号级别。我想要的样子是这样的

([0 1] [0 9] [0 2] [0 8] [1 1] [1 9] ...

我确信这个问题的解决方案很简洁,但我就是想不出来!?

2 答案

0

已选择
 
最佳答案

另一种方法是使用成对作为另一组绑定

(for [ni (range n)
      di (range d)
      :let [j1 (mod (inc di) n)
            j2 (mod (- n (inc di)) n)]
      p [[ni j1] [ni j2]]]
  p)

这个“有趣”的表达式不需要是“for”的返回位置:)

_by
太棒了,谢谢!还有谢谢@alexmiller。我更喜欢这个答案,因为它更好地保留了澄清的`for`结构。
0
by

有多种方法可以实现,一个是将 for 语句更改为使用嵌套的 mapcats。

(mapcat 
  (fn [ni] 
    (mapcat 
      (fn [di] 
        (let [j1 (mod (inc di) n)
              j2 (mod (- n (inc di)) n)]
          [[ni j1] [ni j2]])) 
      (range d))) 
  (range n))
...