码迷,mamicode.com
首页 > 其他好文 > 详细

5.2 vector: 创建和使用vector的各种变体

时间:2015-06-01 06:12:14      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:clojure   vector   函数式   

Clojure练习-5.组合数据类型

“用100个函数来操作一个数据结构比10个函数操作10个数据结构要好很多。基于一个统一的数据结构,我们可以构建出一系列的小函数,这些小函数又可以组合起来形成一个强大的系统。而为不同的数据结构编写不同的函数,在根本上就削减了复用的可能。” —— [ Alan Perlis ]

技术分享

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)

5.2 vector: 创建和使用vector的各种变体

标签:clojure   vector   函数式   

原文地址:http://blog.csdn.net/lord_is_layuping/article/details/46296693

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!