recursion - Clojure - “get”和“nth”的混合?
问题描述
我正在努力寻找一个能在 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 丰富的对序列进行操作的函数集。
推荐阅读
- android - 来自 Android 的 Firebase 动态短链接 Facebook 帖子
- html - 是什么导致元素的宽度与位置:固定不相对于视口
- r - R中的summary(n())和count()困难
- python - 什么时候使用 sys.stdin 比使用 input() 更快?
- r - 警告消息:在更改为数字时强制引入 NA
- location - Miui、Oppo、Vivo 等自定义 rom 的位置问题
- angular - Uncaught Error: Uncaught (in promise): TypeError: Super expression must be null or a function in Angular v6
- python - OpenCV根据像素值查找轮廓
- python - 安装pynacl后无法调用成员
- setuptools - 如何从包中的脚本访问包的模板部分