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 中这么做的方式是什么?

不幸的是,我在网上搜索解决方案时遇到了困难,因为不可避免地,任何包含“序列”的搜索都会让我进入https://docs.clojure.org/clojure.core/seq

1

+1

选定
 
最佳答案

你应该使用范围

(range 10)
; => (0 1 2 3 4 5 6 7 8 9)
感谢众多帮助!
为了完成答案,如果您想要一个在这种情况下具有O(1)访问的已索引数据结构(持久),可以将`range`的结果输出到向量中

(vec (range 10))

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

(long-array (range 10))

向量是规范化的“持久数组列表”。如果您需要进行大量的随机访问或更新,则向量在实践中将远远优于序列,因为序列获取第n个条目的时间复杂度为O(n)(列表性能),并且不像向量那样自带更新操作。

从数学的角度来看,“这不是一个seq结构。我指的是数学序列,例如1,2,3,4,5,6,7,...,n,在Clojure中相当没有意义,因为所有集合或可迭代对象都是可序列的。例如,您可以毫不费力地处理无限序列,并且只需遍历或消费所需用于计算的部分。通常以这种方式定义算法(生成所有可能解的无限序列,然后过滤该序列,从中取出,删除项,映射到它,等等,直到找到结果为止)。您还可以定义生成函数(例如,通过`iterate`或通过`lazy-seq`的低级实现)。https://clojure.github.io/math.combinatorics/(有许多有趣的例子)。
虽然原始答案足够,但我偶尔会使用(vec (range ...)),正如你描述的原因。

如果我为ask.clojure.org启用了电子邮件更新,我就会看到你的评论,并且可能会节省一些麻烦。我现在应该去做。

再次感谢。
...