Recursion Clojure-混合的;获得;及;第n个“;?

Recursion Clojure-混合的;获得;及;第n个“;?,recursion,clojure,set,Recursion,Clojure,Set,我正在努力寻找一个函数,它将在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

我正在努力寻找一个函数,它将在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)
  )
)
我终于实现了我的功能,感谢大家的帮助:

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

您误解了
获取
。它适用于关联集合,如地图和向量。考虑:

(ns tst.demo.core
  (:use tupelo.core tupelo.test))

(dotest
  (let [data-list '(1 (2 3) 4 5)
        data-vec (vec data-list) ]
    (spyx (nth data-list 1))
    (spyx (nth data-vec 1))
    (spyx (get data-list 1))
    (spyx (get data-vec 1))
    ))
结果

(nth data-list 1)  => (2 3)
(nth data-vec 1)   => (2 3)
(get data-list 1)  => nil
(get data-vec 1)   => (2 3)
由于Clojure列表不像映射那样具有关联性,
list
不应与列表一起使用。理想情况下,
get
会在传递一个列表参数时抛出一个异常,以指示它不适用于它们


对于您的具体目标,可能只需执行以下操作:

(take j
  (drop i coll))


有关其他文档,请参见。

n
采用可选的第三个参数
未找到
。如果索引超出范围,则可以使用它提供默认值:

user=>(第n'(1(23)45)-1)
用户/eval1(REPL:1)处的执行错误(IndexOutOfBoundsException)。
无效的
用户=>(第n'(1(23)45)-1无)
无
如果有向量,可以直接使用
subvec

(让[1 2 3 4 5 6 7]]
(第2至6段)
如果你有一个序列,那么你可以写:

(定义子序列[coll start n]
(->coll
(下降开始)
(以n为例)
(子序列’(12(34)(5(67)))12)
=> (2 (3 4))
(子序列’(1234567)24)
=> (3 4 5 6)

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

当索引超出范围时,为什么希望它返回
nil
?似乎应该有更好的选择。我想通过在输出中显示超出范围的x个单位的零x倍来通知用户他们的输入超出范围。只是在文章中添加了一些示例输出。谢谢你的回复。
(take j
  (drop i coll))