当前在线人数6130
首页 - 分类讨论区 - 电脑网络 - 葵花宝典版 -阅读文章
未名交友
[更多]
[更多]
文章阅读:Re: 用Clojure写了一个程序,和python差不多
[同主题阅读] [版面: 葵花宝典] [作者:pseudo] , 2019年03月12日05:27:40
pseudo
进入未名形象秀
我的博客
[上篇] [下篇] [同主题上篇] [同主题下篇]

发信人: pseudo (small man), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Tue Mar 12 05:27:40 2019, 美东)

我前段时间也学了学Clojure,花了些时间好玩。

对FP,我的感觉是需要转变思想,把各种运算转换为reduce,apply这类操作。第二是
,从总体上思考,尽量往集合上靠。

这是我改的一个版本。主要是把所有解用解集的形式表达,同时把递归去掉了。

(def moves [[1 2] [2 1] [-1 2] [-2 1] [1 -2] [2 -1] [-1 -2] [-2 -1]])
(def dim 5)

(defn invalid-pos [[x y]]
  (or (< x 0) (< y 0) (>= x dim) (>= y dim)))

(defn valid-moves [path]
  "Return all next-move positions, nil if none"
  (let [pos (first path)
        seen (set path)]
    (->> (map #(mapv + pos %) moves)
         (remove #(or (invalid-pos %) (seen %)))
         seq)))

(defn grow-paths [path-coll path]
  (if-let [next-pos (valid-moves path)]
    (reduce #(conj %1 (conj path %2)) path-coll next-pos)
    path-coll))

(defn all-paths-0 [init-pos]
  (loop [path-coll (list (list init-pos)) i 1]
    (cond
      (= i (* dim dim)) path-coll
      :else (recur
              (reduce grow-paths () path-coll)
              (inc i)))))

(defn all-paths-1 [init-pos]
  (let [init-coll  (list (list init-pos))
        idx (dec (* dim dim))
        next-paths #(reduce grow-paths () %)]
    (nth (iterate next-paths init-coll) idx)))

--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2600:1700:d090:]

[上篇] [下篇] [同主题上篇] [同主题下篇]
[转寄] [转贴] [回信给作者] [修改文章] [删除文章] [同主题阅读] [从此处展开] [返回版面] [快速返回] [收藏] [举报]
 
回复文章
标题:
内 容:

未名交友
将您的链接放在这儿

友情链接


 

Site Map - Contact Us - Terms and Conditions - Privacy Policy

版权所有,未名空间(mitbbs.com),since 1996