如何验证列表是否已排序?

Jef*_*son 8 list sorted clojure

我怎么能在Clojure中验证是否对数字列表进行了排序?

(def my-list (list 1 2 3 1 4 2 2 4))
Run Code Online (Sandbox Code Playgroud)

sorted?仅当集合实现sorted接口时才返回true .我正在寻找一种reduce可以成对迭代列表的操作,例如(reduce < my-list).我知道我可以手动创建对并比较这些:

(letfn [(pair [l] (if (= (count l) 2) (list l) (cons (take 2 l) (pair (rest l)))))]
    (every? #(apply < %) (pair my-list)))
Run Code Online (Sandbox Code Playgroud)

但这似乎不必要地复杂.在我看来,好像我错过了一个基本功能.

noi*_*ith 22

最简单的解决方案:

(apply <= mylist)

>= 也适用于反向排序

  • 注意`mylist`为空的情况; 你得到一个ArityException.简单修复:`(defn ordered?[xs](或(empty?xs)(apply <= xs))) (6认同)

Art*_*ldt 5

我会对重叠的数字对进行一次传递并检查它们<=(如您所提到的),因为它是 O(n),尽管您不需要手动配对。

user> (partition-all 2 1 [1 2 3 4 5 6])
((1 2) (2 3) (3 4) (4 5) (5 6) (6))

user> (every? #(apply <= %) (partition-all 2 1 [1 2 3 4 6 5]))
false

user> (every? #(apply <= %) (partition-all 2 1 [1 2 3 4 5 6]))
true  
Run Code Online (Sandbox Code Playgroud)