我正在学习Clojure,我找到了解决方案,使用列表理解在Haskell书中找到正确的三角形问题,使问题得到彻底解决:
找到正确的三角形
三面的长度都是整数。
每边的长度小于或等于10.
三角形的周长(边长的总和)等于 24。
在Haskell:
ghci> let rightTriangles' = [ (a,b,c) | c <- [1..10], a <- [1..c], b <- [1..a],
a^2 + b^2 == c^2, a+b+c == 24]
ghci> rightTriangles'
[(6,8,10)]
在Clojure中是否有这样一个优雅的列表理解解决方案?
答案 0 :(得分:12)
Clojure有for
语法:
(for [ c (range 1 (inc 10))
a (range 1 (inc c))
b (range 1 (inc a))
:when (== (+ (* a a) (* b b))
(* c c))
:when (== (+ a b c) 24) ]
[a b c])
答案 1 :(得分:8)
(for [c (range 1 11)
a (range 1 c)
b (range 1 a)
:when (and (= (+ a b c) 24)
(= (* c c) (+ (* a a) (* b b))))]
[a b c])
您还可以通过在:let [c2 (* c c)]
和a
绑定之间插入b
来提高性能,然后在c2
中使用:when
,避免比必要时更频繁地c
。
Clojure for
基本上是列表monad的表示法,:when
表示guard
,:let
表示let
。还有:while
,但我不知道对应的内容是什么。