我正在做项目 euler question 136,并想出了以下内容来测试给出的示例:
module Main where
import Data.List
unsum x y z n = (y > 0) && (z > 0) && (((x*x) - (y*y)- (z*z)) == n) && ((x - y) == (y - z))
answer = snub $ takeWhile (<100) [n|x<-[1..],d<-[1..x`div`2],n<-[x..100],y<-[x-d],z<-[y-d], unsum x y z n ]
where
snub [] = []
snub (x:xs) | elem x xs = snub (filter (/=x) xs)
| otherwise = x : snub xs
snub
将从列表中删除任何重复的数字。
该示例应该提供 25 个解决方案,n
说明哪里x^2 - y^2 - z^2 == n
和所有数字都是正数(或者我从问题中收集到),并且是一个算术级数,使得x-y == y-z
. 但是当我使用代码时,n
会返回一个包含 11 个解决方案的列表。
我在列表理解中做错了什么,我错过了哪些优化?