2012-06-25 37 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”的三角形所满足。 –