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

您好!请参阅关于页面来了解更多有关此网站的信息。

0
Clojure

您好,Clojurians,我在填充一串数字到数组方面有个问题。

这不是一个seq结构。我指的是一个数学序列,例如,1,2,3,4,5,6,7,...,n

我的背景是统计编程,因此生成数字列表是令人惊讶地常见且有用!

在R语言中,要创建一个数字数组您会这样做

seq(1, 10) => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

或者简写

1:10 => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

任意一种方式都是习俗,因为它们易于阅读且速度快。

将数组赋值给变量会是这样

nums = seq(1, 10)
nums => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Clojure如何进行这种操作?

不幸的是,我很难在网上找到解决方案,因为任何包含“sequence”的搜索无疑都会引向https://docs.clojure.org/clojure.core/seq

1 个答案

+1

被选中
 
最佳答案

您应该使用range。

(range 10)
; => (0 1 2 3 4 5 6 7 8 9)
by
非常感谢!
by
要完成这个答案,如果你想在这个情况下有一个具有 O(1) 访问的索引数据结构(持久化)的话,你可以将 `range` 的结果存入向量

(向量(range 10))

或者如果你需要的是一个实际的可变数组,

(长向量(range 10))

向量是惯用的“持久化列表”。如果你要进行大量的随机访问或更新,那么在实际操作中,向量将远远优于序列,因为序列获取第 n 个元素是 O(n) 的(列表性能),而且它们不直接支持更新操作,就像向量一样。

从数学的角度来看,“这不是一个 seq 结构。我指的是数学序列,例如,1, 2, 3, 4, 5, 6, 7, ..., n 在 clojure 中相当没有意义,因为所有的集合或迭代器都是序列化的。例如,你可以轻易地处理无穷序列,并且只遍历或消费计算所需的那么多。通常人们是这样定义算法的(生成所有可能解决方案的无穷序列,然后过滤序列,从中选取、删除元素,映射到它上等,直到找到一个结果)。你也可以定义生成函数(例如通过 `iterate` 或较低级别的 `lazy-seq` 实现)。在https://clojure.github.io/math.combinatorics/ 中有很多有趣的例子。
by
虽然原始答案已经足够了,但我在某些场合使用过(向量(range ...)),原因是你描述的那样。

如果我为 ask.clojure.org 启用了邮件更新,我可能就会看到你的评论,也许能省去一些麻烦。我现在将这样做!

再次感谢。
...