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)]
4

2 回答 2

2

就目前而言,我认为问题的定义略显不足。

前四个词“Find the right triangle”(重点是我的)暗示了一个独特的答案,几乎可以肯定是(6,8,10)。然而,所有与 (6,8,10) 一致的三角形都会遇到问题的其余部分,其中 (8,6,10) 肯定是一个,所以它本身并没有错,但可能不是你的意思要得到。

另一种看待这个问题的方式是,问题定义了一个等价类,其中 (6,8,10) 是规范表示,但是问题没有明确要求规范表示(尽管我们可以推断它可能是预期的答案因此应该使用你的第二个解决方案)

于 2012-06-25T15:17:51.207 回答
1

您必须过滤掉不同的排列。通过限制 a <= b 和 b <= c,您可以做到这一点。您在第二个答案中通过限制 b 和 c 的输入域来做到这一点。b <- [1..c] 意味着 b <= c。

于 2012-06-25T14:02:37.113 回答