【发布时间】:2013-03-13 02:44:40
【问题描述】:
创建一个无限列表对
:: [(Integer, Integer)],其中包含(m,n)形式的对, 其中 m 和 n 都是[0 ..]的成员。一个额外的要求是如果(m,n)是列表的合法成员,则(elem (m,n) pairs)应在有限时间内返回True。 违反此要求的对的实现被视为非解决方案。
****新鲜编辑感谢cmets,让我看看我是否可以取得一些进展****
pairs :: [(Integer, Integer)]
pairs = [(m,n) | t <- [0..], m <- [0..], n <-[0..], m+n == t]
这样的?我只是不知道它会在有限时间内返回 True。
我觉得问题的措辞 elem 不必成为我回答的一部分。如果您调用(elem (m,n) pairs),它应该返回true。听起来对吗?
【问题讨论】:
-
提示:一次生成一条对角线。设置
t = x + y并为[0..]中的每个t生成所有对(x, y)。由于每个t只有有限数量的对,这将满足要求。 -
我喜欢这种方法。除了我不确定如何实现它。
-
不过滤,只生成
m和n的可能值。对于固定的t,m可以拥有的最高值是多少?一旦你选择了t和m,你就可以使用t = m + n直接计算n。 -
您确定您对问题的解释正确吗?
(m,n)的列表是什么意思?也许问题是生成所有m和n满足helper m n == True的(m,n)对(即,当您制作 列表时,您知道helper是什么)? -
在您的上一次修订中,这个问题不再有意义(因为几乎所有内容都已被删除)。我把它回滚了;不确定您的意图是什么(如果您确实想说“这里已经完成,请不要再回答”,那么不要修改您的问题,而只需接受最有帮助的答案)。