对于给定的陈述,哪个是正确的程序?

时间:2012-06-25 13:23:35

标签: haskell logic logic-programming

问题陈述:

找到所有边都有整数的直角三角形,所有等于或小于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)]

2 个答案:

答案 0 :(得分:2)

目前我认为问题略有定义。

前四个单词“查找 直角三角形”(强调我的)表明了一个独特的答案,几乎可以肯定是(6,8,10)。然而,所有与(6,8,10)一致的三角形都能解决问题的其余部分,其中(8,6,10)肯定是一个所以它本身并没有错,但可能不是你的意思得到。

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

答案 1 :(得分:1)

您必须过滤掉不同的排列。通过限制a&lt; = b和b&lt; = c,您可以实现此目的。你通过限制b和c的输入域在第二个答案中这样做了。 b&lt; - [1..c]意味着b <= c。