gpt4 book ai didi

common-lisp - 在 Lisp 中寻找直角三角形

转载 作者:行者123 更新时间:2023-12-02 07:03:23 24 4
gpt4 key购买 nike

我正在浏览“Learn You a Haskell”并在 this page 的最底部找到,一种找到表示具有指定周长的直角三角形的三元组 (a, b, c) 的方法,我发现它非常优雅 --

ghci> let rightTriangles' = [ (a,b,c) | c <- [1..10], b <- [1..c], a <- [1..b], a^2 + b^2 == c^2, a+b+c == 24]

我想知道是否有一种方法可以在 Lisp 中以类似的方式/不显式地使用循环来做到这一点。这是我所做的——

(defun sq (x) (expt x 2))

(loop for c from 1 to 10 do
(loop for a from 1 to c do
(let ((b (- 24 a c)))
(if (= (sq c) (+ (sq a) (sq b)))
(format t "~a, ~a, ~a~%" a b c)))))

但它显然不像 Haskell 版本那么好,它还打印了两次解决方案 ((6, 8, 10) 和 (8, 6, 10)) 因为 a从 1 到 c

最佳答案

自从我在 CL 中为集合论编写了一个玩具库以来,我就忍不住尝试一下。参见 http://repo.or.cz/w/flub.git/blob/HEAD:/bachelor-cs/set-theory.lisp .

(use-package '(:alexandria :bachelor-cs.set-theory))

(defun triangles (h)
(let ((range (iota h :start 1)))
(∩ (× (× range range) range)
(lambda (triangle)
(destructuring-bind ((a b) c) triangle
(>= c b a))))))

(defun perimeter (n)
(lambda (triangle)
(destructuring-bind ((a b) c) triangle
(= n (+ a b c)))))

(defun right-triangles (triangle)
(destructuring-bind ((a b) c) triangle
(= (* c c) (+ (* a a) (* b b)))))

(∩ (∩ (triangles 10) (perimeter 24)) #'right-triangles) ↦ (((6 8) 10))

这里难看的一点是三角形表示为 '((a b) c) 因为集合操作被定义为二进制。所以是的,现在我有一个很好的谜语要解决:定义可变参数列表的集合操作。

干杯,最大

编辑:我将集合操作设为 n 元。现在可以这样写:

(∩ (× (iota 10 :start 1) (iota 10 :start 1) (iota 10 :start 1))
(lambda (tri)
(destructuring-bind (a b c) tri
(>= c b a)))
(lambda (tri)
(destructuring-bind (a b c) tri
(= 24 (+ a b c))))
(lambda (tri)
(destructuring-bind (a b c) tri
(= (+ (* a a) (* b b)) (* c c)))))

如果添加一个简单的宏→

(defmacro → (args &rest body)
(let ((g!element (gensym "element")))
`(lambda (,g!element)
(destructuring-bind ,args ,g!element
,@body))))

恕我直言,就可读性而言,您非常接近 Haskell 版本:

(∩ (× (iota 10 :start 1) (iota 10 :start 1) (iota 10 :start 1))
(→ (a b c) (>= c b a))
(→ (a b c) (= 24 (+ a b c)))
(→ (a b c) (= (+ (* a a) (* b b)) (* c c))))

关于common-lisp - 在 Lisp 中寻找直角三角形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16570250/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com