gpt4 book ai didi

clojure - 有没有更好的方法来编写将元素插入 clojure 中的排序列表的代码?

转载 作者:行者123 更新时间:2023-12-04 00:34:58 25 4
gpt4 key购买 nike

我正在 https://iloveponies.github.io/120-hour-epic-sax-marathon/one-function-to-rule-them-all.html 上做练习 7 .我有一个解决方案,但是因为预期的输出是一个列表,所以我不得不在我的一些输出中添加一个“反向”。这似乎有点老套。

这是我的代码:

(defn insert [sorted-seq n]
(loop [output ()
my-seq sorted-seq]
(cond
(nil? (first my-seq))
(conj output n)
(nil? (first (rest my-seq)))
(reverse (conj output (first my-seq) n))
:else
(if (> (first (rest my-seq)) n (first my-seq))
(reverse (apply conj output (first my-seq) n (rest my-seq)))
(recur (conj output (first my-seq)) (rest my-seq))))))

(insert [] 2) ;=> (2)
(insert [1 3 4] 2) ;=> (1 2 3 4)
(insert [1] 2) ;=> (1 2)

有没有更好的写法,效率更高,而且不需要反转输出?此外,前两个条件似乎很笨重。有没有更好的办法?

最佳答案

@A.Webb 的解决方案就是您正在寻找的解决方案,但留给 future 的访问者使用。

我认为你把问题稍微复杂化了。

总体思路是这样的:

  1. 找到您需要插入元素的站点。
  2. 此时将序列一分为二。
  3. 连接第一个结果序列、元素、第二个结果序列。

您可以使用 split-with 组合 1 和 2| , 它将序列分成两部分:一部分谓词为真,另一部分谓词为假。

所以,说到 clojure:

(defn insert [coll n]
(let [[l r] (split-with #(< % n) coll)]
(concat l [n] r))

关于clojure - 有没有更好的方法来编写将元素插入 clojure 中的排序列表的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25668058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com