当前在线人数14853
首页 - 分类讨论区 - 电脑网络 - 葵花宝典版 - 同主题阅读文章

此篇文章共收到打赏
0

  • 10
  • 20
  • 50
  • 100
您目前伪币余额:0
未名交友
[更多]
[更多]
用Clojure写了一个程序,和python差不多
[版面:葵花宝典][首篇作者:TheMatrix] , 2019年03月08日11:42:35 ,1665次阅读,64次回复
来APP回复,赚取更多伪币 关注本站公众号:
[首页] [上页][下页][末页] [分页:1 2 3 4 ]
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 1 ]

发信人: TheMatrix (TheMatrix), 信区: Programming
标  题: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Fri Mar  8 11:42:35 2019, 美东)

在学习Clojure。写了一个简单递归程序,跳马问题。马在5X5的棋盘上,初始位置在(0
,0),马走日,要遍历棋盘,还不能走已经走过的位置。列出所有的遍历方式。

写了个Clojure,又写了个python,发现这两个可以写的几户一样。我觉得JavaScript
也可以写成这个样子。

我觉得从可读性来看程序结构这方面,python应该算最好的了。其他语言写法上可以往
python上靠。

--
☆ 发自 iPhone 买买提 1.24.09
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2607:fb90:9828:]


此主题相关图片如下:

[删除]

 
guvest
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 2 ]

发信人: guvest (我爱你老婆Anna), 信区: Programming
标  题: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Fri Mar  8 12:03:08 2019, 美东)

函数在各种语言的定义里面,相对来讲是比较一致的。而且函数调用的stack在多线程
都是隔离的,不管什么语言,虚拟机。所以多语言编程,我觉得纯函数用的越多越好。

--
※ 来源:· 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2607:fb90:1cdf:]

 
Liber8
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 3 ]

发信人: Liber8 (Space-Time continuum), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Fri Mar  8 12:43:34 2019, 美东)

这么多括号
【 在 TheMatrix (TheMatrix) 的大作中提到: 】
: 在学习Clojure。写了一个简单递归程序,跳马问题。马在5X5的棋盘上,初始位置在
(0
: ,0),马走日,要遍历棋盘,还不能走已经走过的位置。列出所有的遍历方式。
: 写了个Clojure,又写了个python,发现这两个可以写的几户一样。我觉得
JavaScript
: 也可以写成这个样子。
: 我觉得从可读性来看程序结构这方面,python应该算最好的了。其他语言写法上可以往
: python上靠。



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

 
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 4 ]

发信人: TheMatrix (TheMatrix), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Fri Mar  8 12:52:21 2019, 美东)

括号折叠过去,阅读上也差不多。

【 在 Liber8 (Space-Time continuum) 的大作中提到: 】
: 这么多括号
: (0
: JavaScript




--
☆ 发自 iPhone 买买提 1.24.09
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2607:fb90:9828:]

 
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 5 ]

发信人: TheMatrix (TheMatrix), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Fri Mar  8 13:13:23 2019, 美东)

改成thread last macro就完全一样了。

--
☆ 发自 iPhone 买买提 1.24.09
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2607:fb90:9828:]


此主题相关图片如下:

[删除]

 
hci
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 6 ]

发信人: hci (海螺子), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Fri Mar  8 15:17:09 2019, 美东)

我来code review一下:

1. 可以看出, 你还没有从imperative programming换成FP思维。因为你还在把for当
成for-loop在用,for是list comprehension,不是for-loop。Idiomatic Clojure在你
用for的地方,就用map。
2. 你用两道filter,其实应该就写在一个函数里面;
3. 要多用destructuring.
4. 集合可以当函数用,不用contain?
5. 简单函数用shorthand,省时省地方。
6. 用let把这个集合操作提出来,给个名字,不用重算了,代码目的更清晰

(defn possible-pos [path pos]
  (let [seen (set path)]
    (->> moves
        (map #(map + pos %))
        (filter
          (fn [[x y :as p]]
            (and (not (seen p)) (>= x 0) (>= y 0) (< x dim) (< y dim)))))))

(defn jump [path pos]
  (if (= (count path) (* dim dim))
    (println path)
    (map #(jump (conj path %) %) (possible-pos path pos))))


【 在 TheMatrix (TheMatrix) 的大作中提到: 】
: 在学习Clojure。写了一个简单递归程序,跳马问题。马在5X5的棋盘上,初始位置在
(0
: ,0),马走日,要遍历棋盘,还不能走已经走过的位置。列出所有的遍历方式。
: 写了个Clojure,又写了个python,发现这两个可以写的几户一样。我觉得
JavaScript
: 也可以写成这个样子。
: 我觉得从可读性来看程序结构这方面,python应该算最好的了。其他语言写法上可以往
: python上靠。










--
※ 修改:·hci 於 Mar  9 01:20:39 2019 修改本文·[FROM: 67.]
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 73.]

 
hci
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 7 ]

发信人: hci (海螺子), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Fri Mar  8 15:37:33 2019, 美东)

我写这个,与python差别是不是出来了?

【 在 hci (海螺子) 的大作中提到: 】
: 我来code review一下:
: 1. 可以看出, 你还没有从imperative programming换成FP思维。因为你还在把for当
: 成for-loop在用,for是list comprehension,不是for-loop。Idiomatic Clojure在你
: 用for的地方,就用map。
: 2. 你用两道filter,其实应该就写在一个函数里面;
: 3. 要多用destructuring.
: 4. 集合可以当函数用,不用contain?
: 5. 简单函数用shorthand,省时省地方。
: 6. 用let把这个集合操作提出来,给个名字,不用重算了,代码目的更清晰
: (defn possible-pos [path pos]
: ...................



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

 
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 8 ]

发信人: TheMatrix (TheMatrix), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Fri Mar  8 18:09:05 2019, 美东)

谢谢code review,还有这么详细的点评。好,听老司机的。

【 在 hci (海螺子) 的大作中提到: 】
: 我来code review一下:
: 1. 可以看出, 你还没有从imperative programming换成FP思维。因为你还在把for当
: 成for-loop在用,for是list comprehension,不是for-loop。Idiomatic Clojure在你
: 用for的地方,就用map。
: 2. 你用两道filter,其实应该就写在一个函数里面;
: 3. 要多用destructuring.
: 4. 集合可以当函数用,不用contain?
: 5. 简单函数用shorthand,省时省地方。
: 6. 用let把这个集合操作提出来,给个名字,不用重算了,代码目的更清晰
: (defn possible-pos [path pos]
: ...................




--
☆ 发自 iPhone 买买提 1.24.09
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2607:fb90:9828:]

 
sanwadie
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 9 ]

发信人: sanwadie (三娃爹), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Fri Mar  8 23:12:54 2019, 美东)

你写的我还看得懂,他写得是天书 :)我还是用python吧。

【 在 TheMatrix (TheMatrix) 的大作中提到: 】
: 谢谢code review,还有这么详细的点评。好,听老司机的。




--
☆ 发自 iPhone 买买提 1.24.09
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 66.]

 
hci
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 10 ]

发信人: hci (海螺子), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Sat Mar  9 01:03:52 2019, 美东)

Like this?

http://classicprogrammerpaintings.com/post/142435074314/consultant-shows-clojure-code-sample-to-vba

“Consultant shows Clojure code sample to VBA team”, Rembrandt, Oil on
canvas, 1635


【 在 sanwadie (三娃爹) 的大作中提到: 】
: 你写的我还看得懂,他写得是天书 :)我还是用python吧。




--
※ 修改:·hci 於 Mar  9 01:04:34 2019 修改本文·[FROM: 67.]
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 67.]

 
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 11 ]

发信人: TheMatrix (TheMatrix), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Sat Mar  9 13:21:55 2019, 美东)

普通的程序,用这两种语言写,思路真的区别不大。hci改的几个地方,是一些小的
refactoring。如果从refactoring path走过来,那么每一个改进都是小的,也就容易
懂了。

我学Clojure已经学了好几次了,每次停下来都是感觉和其他语言区别不大,没必要费
劲。这次是想get到“程序即数据”的感觉。code generation的威力,我在其他语言中
感受到了一点点,这方面我对Clojure期待很多。不过目前还没有到达那个地方。

【 在 sanwadie (三娃爹) 的大作中提到: 】
: 你写的我还看得懂,他写得是天书 :)我还是用python吧。




--
☆ 发自 iPhone 买买提 1.24.09
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 50.]

 
hci
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 12 ]

发信人: hci (海螺子), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Sat Mar  9 15:35:24 2019, 美东)

到那个地方,第一步,是FP思维,第二步,宏,第三步,自造一个数据驱动的DSL。


【 在 TheMatrix(TheMatrix) 的大作中提到: 】
<br>: 普通的程序,用这两种语言写,思路真的区别不大。hci改的几个地方,是一些
小的
<br>: refactoring。如果从refactoring path走过来,那么每一个改进都是小的,也
就容易
<br>: 懂了。
<br>: 我学Clojure已经学了好几次了,每次停下来都是感觉和其他语言区别不大,没
必要费
<br>: 劲。这次是想get到“程序即数据”的感觉。code generation的威力,我在其他
语言中
<br>: 感受到了一点点,这方面我对Clojure期待很多。不过目前还没有到达那个地方。
<br>
--
※ 来源:· 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2600:387:b:9a2:]

 
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 13 ]

发信人: TheMatrix (TheMatrix), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Sat Mar  9 23:32:34 2019, 美东)

又重构了一下:

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

(defn possible-pos [path pos]
  (->> moves
    (map #(map + pos %))
    (filter (fn [[x y]] ((set (range dim)) x)))
    (filter (fn [[x y]] ((set (range dim)) y)))
    (filter #(not ((set path) %)))))

(defn jump [path pos]
  (if (= (count path) (* dim dim))
    (println path)
    (->> (possible-pos path pos)
      (map #(jump (conj path %) %)))))

(jump [[0 0]] [0 0])


我用thread last macro把几个地方改了一下。用thread last把map和filter串起来,
我感觉很方便。这个用法和clojure本身的for list comprehension,以及python的
list comprehension都很象。和其他语言所谓的flow style编程也很类似。

filter我用了三次,一次filter一点,这个是我喜欢的用法。不过我的口味也不固定,
有时这样有时那样。

let seen没有提出来,因为我看那行code长度比较合适,太长的我才提出。

尽量用了anonymous function shorthand的写法,但是有两个怎么也写不出来。它们用
到了parameter destructuring,我试图先写成

(filter (fn [p] ((set (range dim)) (get p 0))))

然后再写成

(filter #((set (range dim)) (get % 0)))

但是不行。第一种写法就不行。不知道为什么。



【 在 hci (海螺子) 的大作中提到: 】
: 我来code review一下:
: 1. 可以看出, 你还没有从imperative programming换成FP思维。因为你还在把for当
: 成for-loop在用,for是list comprehension,不是for-loop。Idiomatic Clojure在你
: 用for的地方,就用map。
: 2. 你用两道filter,其实应该就写在一个函数里面;
: 3. 要多用destructuring.
: 4. 集合可以当函数用,不用contain?
: 5. 简单函数用shorthand,省时省地方。
: 6. 用let把这个集合操作提出来,给个名字,不用重算了,代码目的更清晰
: (defn possible-pos [path pos]
: ...................



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

 
hci
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 14 ]

发信人: hci (海螺子), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Sun Mar 10 00:13:38 2019, 美东)

Clojure的各种数据结构有其自身特性,应该学会每个数据结构的概念是什么,否则会
有问题。

这也是一些人初学觉得Clojure设计有问题的地方,算是Clojure的实用性与一致性的权
衡吧。你现在遇到一个了。

1. Clojure函数是工作在抽象数据结构的接口层面上的,也就是Java Interface层次。
比如大部分函数是在Seq这个非常general的抽象层次。一般来说,你可以把Seq想成是
个List,当然List更具体,但一般把seq想成List就够了

2 有的函数是工作在更具体的数据结构层次上的,比如get,其实是工作在Map这个抽象
数据结构上的。

(doc get)
-------------------------
clojure.core/get
([map key] [map key not-found])
  Returns the value mapped to key, not-found or nil if key not present.

一般初学者不知道这个,以为get是在seq上工作的,就会犯你的(get q 0)不work的错
误。当然不会work, q是个seq,不是map。但如果q是个vector,那(get q 0)就会work
, 因为vector实现了map接口, 用index做key.

所以记住这个,只有list不是map, 而map, vector, set都可以当map用, set其实是一
个key=value的map, vector是个index=key的map. 

那为什么不把list也设计成map呢?因为不合理. List概念上是Lisp的linked list,它
不是一个可以random access by index的数据结构,所以不能当map用,没有正确的
performance characteristics。而vector可以。

还有一个区别,同一个conj函数, 在list上,是conj到前面,与cons一样的,而用在
vector上,是conj在后面。也是因为不同的performance expectation.

这一点,知道了设计意图,也就容易明白了。在一致性与实用性冲突的时候,Clojure
总是选实用性。


【 在 TheMatrix (TheMatrix) 的大作中提到: 】
: 又重构了一下:
: (def moves [[1 2] [2 1] [-1 2] [2 -1] [1 -2] [-2 1] [-1 -2] [-2 -1]])
: (def dim 5)
: (defn possible-pos [path pos]
:   (->> moves
:     (map #(map + pos %))
:     (filter (fn [[x y]] ((set (range dim)) x)))
:     (filter (fn [[x y]] ((set (range dim)) y)))
:     (filter #(not ((set path) %)))))
: (defn jump [path pos]
: ...................




--
※ 修改:·hci 於 Mar 10 00:16:18 2019 修改本文·[FROM: 67.]
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 67.]

 
nchip
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 15 ]

发信人: nchip (脑残芯), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Sun Mar 10 03:31:38 2019, 美东)

其实把这个花一个周末的时间过一遍,你就能读懂"天书"了。

https://kimh.github.io/clojure-by-example/#about


这是最简的Introduction,至少能让你达到hci说的三步走的第一步。
而且hci mention的几个“坑”这个里面都有讲到。

【 在 sanwadie (三娃爹) 的大作中提到: 】
: 你写的我还看得懂,他写得是天书 :)我还是用python吧。




--
※ 修改:·nchip 於 Mar 10 03:35:29 2019 修改本文·[FROM: 89.]
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 89.]

 
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 16 ]

发信人: TheMatrix (TheMatrix), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Sun Mar 10 10:35:58 2019, 美东)

谢谢。这样就清楚了。

那么这个p要变回vector才可以用get:
(filter (fn [p] ((set (range dim)) (get (vec p) 0))))

然后改成anonymous function shorthand的形式:
(filter #((set (range dim)) (get (vec %) 0)))

不过这个还没有parameter destructure清楚:
(filter (fn [[x y]] ((set (range dim)) x)))


【 在 hci (海螺子) 的大作中提到: 】
: Clojure的各种数据结构有其自身特性,应该学会每个数据结构的概念是什么,否则会
: 有问题。
: 这也是一些人初学觉得Clojure设计有问题的地方,算是Clojure的实用性与一致性的权
: 衡吧。你现在遇到一个了。
: 1. Clojure函数是工作在抽象数据结构的接口层面上的,也就是Java Interface层次。
: 比如大部分函数是在Seq这个非常general的抽象层次。一般来说,你可以把Seq想成是
: 个List,当然List更具体,但一般把seq想成List就够了
: 2 有的函数是工作在更具体的数据结构层次上的,比如get,其实是工作在Map这个抽象
: 数据结构上的。
: (doc get)
: ...................



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

 
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 17 ]

发信人: TheMatrix (TheMatrix), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Sun Mar 10 10:36:35 2019, 美东)

谢谢。这个blog写的很好。

【 在 nchip (脑残芯) 的大作中提到: 】
: 其实把这个花一个周末的时间过一遍,你就能读懂"天书"了。
: https://kimh.github.io/clojure-by-example/#about
: 这是最简的Introduction,至少能让你达到hci说的三步走的第一步。
: 而且hci mention的几个“坑”这个里面都有讲到。



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

 
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 18 ]

发信人: TheMatrix (TheMatrix), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Sun Mar 10 12:19:19 2019, 美东)

可以用nth,first,second,last,这些都work on list。

(filter #((set (range dim)) (nth % 0))) ;for x
(filter #((set (range dim)) (nth % 1))) ;for y
(filter #((set (range dim)) (first %))) ;for x
(filter #((set (range dim)) (second %))) ;for y
(filter #((set (range dim)) (last %))) ;for y

【 在 TheMatrix (TheMatrix) 的大作中提到: 】
: 谢谢。这样就清楚了。
: 那么这个p要变回vector才可以用get:
: (filter (fn [p] ((set (range dim)) (get (vec p) 0))))
: 然后改成anonymous function shorthand的形式:
: (filter #((set (range dim)) (get (vec %) 0)))
: 不过这个还没有parameter destructure清楚:
: (filter (fn [[x y]] ((set (range dim)) x)))



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

 
pseudo
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 19 ]

发信人: 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:]

 
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 20 ]

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

不错。你这个是前锋推进法。

我的程序有个毛病:想要的结果我是从println里输出的,但是在repl里面执行还会输
出递归函数的结果表达式,是一个巨长的list of list of empty。我还没想清楚这到
底是个什么,以及如何把它去掉。

【 在 pseudo (small man) 的大作中提到: 】
: 我前段时间也学了学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"
: ...................




--
☆ 发自 iPhone 买买提 1.24.09
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2607:fb90:9828:]

[首页] [上页][下页][末页] [分页:1 2 3 4 ]
[快速返回] [ 进入葵花宝典讨论区] [返回顶部]
回复文章
标题:
内 容:

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

友情链接


 

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

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