直角三角形我撇「瞭解你一個Haskell」,結果發現,在this page最底部,找到一個三元組(A,B,C)代表一個直角三角形與周邊我指定的方式發現非常高雅 -發現Lisp中
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
。
那麼,Haskell代碼不會像你這樣計算b。它實際上循環c從1到10,b從1到c,以及從1到b。 (OK,它不會循環,它會生成序列。)這就解釋了爲什麼Haskell只打印一個解決方案,而您的LISP生成兩個解決方案。 –
在LISP中沒有用於生成序列的內建函數;你可以使用尾遞歸來實現,但使用循環更容易閱讀,並且可能效率更高。你可以用一個函數模擬Haskell *(defun序列(ab)(循環爲我從a到b收集i))* –
如果你在外層循環中添加一個名爲outer的'並且具有真實條件'(從外部返回),這將使它在邏輯上正確。但醜陋。 –