Recursion Clojure-混合的;获得;及;第n个“;?
我正在努力寻找一个函数,它将在get函数和nth函数之间找到一个满意的中介。我对这些序列类型的函数做了很多研究,有人知道这方面的解决方法吗,或者知道这样执行的函数吗 我需要nth抓取子列表的能力: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
=> (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))