Clojure练习-5.组合数据类型
“用100个函数来操作一个数据结构比10个函数操作10个数据结构要好很多。基于一个统一的数据结构,我们可以构建出一系列的小函数,这些小函数又可以组合起来形成一个强大的系统。而为不同的数据结构编写不同的函数,在根本上就削减了复用的可能。” —— [ Alan Perlis ]
- Clojure练习-5组合数据类型
- 组合数据类型
- 2 vector 创建和使用vector的各种变体
- 已知
- 解1
- 测试
- 解2
- 测试
- 2 vector 创建和使用vector的各种变体
- 组合数据类型
5. 组合数据类型
5.2 vector: 创建和使用vector的各种变体
实现一个函数:已知 一个二维方阵,
输入: 某点位置
返回: 某点的所有邻接位置(不包括对角线方向)。
已知
(def matrix
"二维方阵"
[[1 2 3] [4 5 6] [7 8 9]])
(doc matrix)
; 取值
(get-in matrix [1 2]) ;=> 6
; 取值-遍历取值
(map #(get-in matrix %) ‘([1 2])) ;=> (6)
(map #(get-in matrix %) ‘([1 0] [0 1])) ;=> (4 2)
; x,y分别相加
(map + [0 0] [-1 0]) ;=> (-1 0)
; x,y分别相加 - 遍历
(def Δ [[-1 0] [1 0] [0 -1] [0 1]])
(map #(map + [0 0] %) Δ) ;=> ((-1 0) (1 0) (0 -1) (0 1))
; 使用filter
(doc filter)
(filter #(< % 3) (range 10)) ;=> (0 1 2)
解1
;;版本1
(defn neighbors
"在二维方阵中查找某点邻接位置
输入:
size 表示 二位方阵的边长
xy 表示 某点
Δ 表示 相对于xy的距离
返回: 如 ((1 0) (0 1))
"
([size xy] (neighbors [[-1 0] [1 0] [0 -1] [0 1]] size xy))
([Δ size xy]
(filter (fn [an-xy] (every? #(< -1 % size) an-xy)) ;filter的实参1
‘((-1 0) (1 0) (0 -1) (0 1)) ;filter的实参2
)
)
)
测试
;;测试
(neighbors 3 [0 0]);=> ((1 0) (0 1))
解2
;;版本2
(defn neighbors
"在二维方阵中查找某点邻接位置
输入:
size 表示 二位方阵的边长
xy 表示 某点
Δ 表示 相对于xy的距离
返回: 如 ((1 0) (0 1))
"
([size xy] (neighbors [[-1 0] [1 0] [0 -1] [0 1]] size xy))
([Δ size xy]
(filter (fn [an-xy] (every? #(< -1 % size) an-xy)) ;filter的实参1
(map #(map + [0 0] %) Δ) ;filter的实参2
)
)
)
测试
;;测试
(neighbors 3 [0 0]);=> ((1 0) (0 1))
(map #(get-in matrix %) (neighbors 3 [0 0])); => (4 2)
时间: 2024-10-13 05:59:32