【问题标题】:reverse a vector in clojure (noob)在 clojure (noob) 中反转向量
【发布时间】:2026-01-06 15:15:02
【问题描述】:

您好,我刚开始使用 Clojure,但无法反转整数向量。

;generate a vector of random integers
(defn generate-rands
  [x]
  (vector (take x (repeatedly #(rand-int 100))))
  )

;vector of integers
(def my-vector (generate-rands 10))

;reverse the vector of integers
(def my-vector-reversed (reverse my-vector))

;main
(defn main-app
  []  
  (println "My Vector: \t\t\t" my-vector)
  (println "My Vector Reversed: \t" my-vector-reversed))

输出是

=> (main-app)
My Vector:           [(14 49 29 3 66 7 60 60 34 19)]
My Vector Reversed:  [((14 49 29 3 66 7 60 60 34 19))]
nil
#'startingclojure.app/main-app

=> (vector? my-vector-reversed)
false

有人可以解释一下为什么my-vector-reversed 不是向量吗?以及如何反转“我的向量”的内容? 谢谢

【问题讨论】:

    标签: clojure


    【解决方案1】:

    此外,当您使用vectorsorted-map 时,最好使用rseq 而不是reverse。它具有恒定的时间,因为它们被编入索引并且可以有效地朝任一方向行走。

    【讨论】:

      【解决方案2】:

      来自reverse's doc

      以相反的顺序返回 coll 中项目的 seq。不懒。

      reverse 把任何东西都变成一个 seq,意思是一个列表。为了取回一个向量,你应该把它变成一个向量:

      (into [] (reverse [1 2 3 4])) ; =>[4 3 2 1]
      

      在你的情况下,看看你的“我的向量”:[(14 49 29 3 66 7 60 60 34 19)] - 它是一个包含单个元素的向量 - 一个序列。所以扭转它不会改变任何东西。您应该使用相同的技术将您的 seq 转换为向量:

      (defn generate-rands
        [x]
        (into [] (take x (repeatedly #(rand-int 100)))))
      

      【讨论】:

        【解决方案3】:

        reverse 函数总是返回一个seq,而不是一个向量。您可以再次将结果转换为向量,例如:(apply vector (reverse [1 2 3]))

        【讨论】: