gpt4 book ai didi

recursion - Clojure - "get"和 "nth"的混合?

转载 作者:行者123 更新时间:2023-12-02 22:57:51 24 4
gpt4 key购买 nike

我正在努力寻找一个能够在 get 函数和 nth 之间找到折衷方案的函数。我一直在对这些序列类型函数进行大量研究,有谁知道解决此问题的方法或知道执行此类操作的函数吗?

我需要 nth 获取子列表的能力:

=> (nth '(1 (2 3) 4 5) 1)
(2 3)
=> (get 1 '(1 (2 3) 4 5))
nil

我需要 get 能够在超出范围时返回“nil”:

=> (get -1 '(1 (2 3) 4 5))
nil
=> (nth '(1 (2 3) 4 5) -1)
Execution error (IndexOutOfBoundsException) at user/eval149 (REPL:1).
null

我需要这个代码来实现递归子序列函数:

(defn sub-seq [coll i j]
(nth coll i)
(if (< i (+ i j))
(sub-seq coll (inc' i) j)
)
)

(sub-seq 函数应该返回从位置“i”开始的“j”个元素。)

以下是我想要编写的一些示例输出:

=> (sub-seq '(1 2 (3 4) (5 (6 7))) 1 2))
(2 (3 4))
=> (sub-seq '(1 2 3 4 5 6 7) 2 4)
(3 4 5 6)

我终于让我的功能正常工作了,谢谢大家的帮助:

(defn sub-seq [coll i j]
(conj
(list*
(nth coll i nil)
(if (> j 1)
(sub-seq coll (+ i 1) (- j 1))))))

最佳答案

nth 采用可选的第三个参数 not-found。如果您的索引超出范围,您可以使用它来提供默认值:

user=> (nth '(1 (2 3) 4 5) -1)
Execution error (IndexOutOfBoundsException) at user/eval1 (REPL:1).
null
user=> (nth '(1 (2 3) 4 5) -1 nil)
nil

如果你有一个向量,你可以直接使用subvec:

(let [s [1 2 3 4 5 6 7]]
(subvec s 2 6))

如果你有一个序列,那么你可以写:

(defn subsequence [coll start n]
(->> coll
(drop start)
(take n)))

(subsequence '(1 2 (3 4) (5 (6 7))) 1 2)
=> (2 (3 4))
(subsequence '(1 2 3 4 5 6 7) 2 4)
=> (3 4 5 6)

旁注:在编写 Clojure 程序时,通常可以通过序列处理更简单地解决问题。有时递归算法是必要的,但通常您可以使用 Clojure 丰富的对序列进行操作的函数集来完成。

关于recursion - Clojure - "get"和 "nth"的混合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60517355/

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