我想迭代2个(或3个)无限列表,并找到满足条件的“最小”对,如下所示:
until pred [(a,b,c) | a<-as, b<-bs, c<-cs]
where pred (a,b,c) = a*a + b*b == c*c
as = [1..]
bs = [1..]
cs = [1..]以上操作不会走得太远,因为a == b == 1在整个程序运行过程中都是如此。有没有一个很好的方法来解决这个问题,比如构建无限序列[(1,1,1),(1,2,1),(2,1,1),(2,1,2),(2,2,1),(2,2,2),(2,2,3),(2,3,2),..]?
奖励:可以推广到n-tuple吗?
发布于 2013-09-19 22:08:15
对于这个答案,我将使用“最小”来表示元组中数字的总和。
要按顺序列出所有可能的对,可以先列出和为2的所有对,然后列出和为3的所有对,依此类推。在代码中
pairsWithSum n = [(i, n-i) | i <- [1..n-1]]
xs = concatMap pairsWithSum [2..]Haskell没有在不使用模板Haskell的情况下处理n-tuple的工具,因此为了推广这一点,您必须切换到列表。
ntuplesWithSum 1 s = [[s]]
ntuplesWithSum n s = concatMap (\i -> map (i:) (ntuplesWithSum (n-1) (s-i))) [1..s-n+1]
nums n = concatMap (ntuplesWithSum n) [n..]https://stackoverflow.com/questions/18896172
复制相似问题