2012-06-25 66 views
2

問題陳述:這是給定語句的正確程序嗎?

查找對各方和各方等於或小於10的整數的直角三角形有24

哪以下兩種溶液周長爲正確解釋問題並給出正確答案?

如果第一個解決方案不正確,那麼在類似的情況下如何避免這種編程錯誤?

首個解決方案:

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

二解決方案:

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] 
ghci> rightTriangles' 
[(6,8,10)] 
+0

有人可能會爭辯說,正確的一段代碼將像第一個解決方案,但交換出「a^2 + b^2 == c^2」更令人興奮的條件'a^2 + b^2 == c^2 || a^2 + c^2 == b^2 || b^2 + c^2 == a^2'。 =) –

回答

2

就目前來看,我認爲問題略有定義。

前四個字「查找直角三角形「(強調我的)提示了一個獨特的答案,這幾乎肯定是(6,8,10)。然而,剩下的問題可以通過與(6,8,10)一致的所有三角形來滿足,其中(8,6,10)肯定是一個,所以它本身並不是錯的,但可能不是你的意思要得到。

另一種看待這個問題的方法是,問題定義了一個等價類,其中(6,8,10)是規範表示,然而問題沒有明確要求規範表示(儘管我們可以推斷它是可能是預期的答案,因此應該使用你的第二個解決方案)

1

你必須篩選出不同的排列。通過限制a < = b和b < = c,您可以完成此操作。你在第二個答案中通過限制b和c的輸入域來做到這一點。 b < - [1..c]意味着b < = c。

+0

事實上,當我讀他的代碼時,限制'b <= c'使我驚訝!我認爲沒關係......但僅僅是因爲無論如何它都會被任何一個「a^2 + b^2 == c^2」的三角形所滿足。 –