2012-06-25 3 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» в любом случае. –

Смежные вопросы