首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Haskell中无限列表上的燕尾迭代

Haskell中无限列表上的燕尾迭代
EN

Stack Overflow用户
提问于 2013-09-19 21:36:22
回答 9查看 1.1K关注 0票数 7

我想迭代2个(或3个)无限列表,并找到满足条件的“最小”对,如下所示:

代码语言:javascript
复制
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吗?

EN

Stack Overflow用户

发布于 2013-09-19 22:08:15

对于这个答案,我将使用“最小”来表示元组中数字的总和。

要按顺序列出所有可能的对,可以先列出和为2的所有对,然后列出和为3的所有对,依此类推。在代码中

代码语言:javascript
复制
pairsWithSum n = [(i, n-i) | i <- [1..n-1]]
xs = concatMap pairsWithSum [2..]

Haskell没有在不使用模板Haskell的情况下处理n-tuple的工具,因此为了推广这一点,您必须切换到列表。

代码语言:javascript
复制
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..]
票数 0
EN
查看全部 9 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18896172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档