Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance Haskell-列表理解可以';t枚举N×;N_Performance_List_Haskell_List Comprehension - Fatal编程技术网

Performance Haskell-列表理解可以';t枚举N×;N

Performance Haskell-列表理解可以';t枚举N×;N,performance,list,haskell,list-comprehension,Performance,List,Haskell,List Comprehension,我必须写一个函数,返回所有对(x,y)的列表,其中x, Y∈ N,以及: x是两个自然数的乘积(x=a•b,其中a,b∈ N) 及 x确实大于5,但实际上小于500,并且 y是一个平方数(y=c²,其中c∈ N) 不大于1000,以及 x是y的除数 我的尝试: listPairs::[(Int,Int)] listPairs=[(a*b,y)| y因此,无限列表上的嵌套列表理解当然不会终止 幸运的是,您的列表不是无限的。这是有限制的。如果x=a*b

我必须写一个函数,返回所有对(x,y)的列表,其中x, Y∈ N,以及:

  • x是两个自然数的乘积(x=a•b,其中a,b∈ N) 及
  • x确实大于5,但实际上小于500,并且
  • y是一个平方数(y=c²,其中c∈ N) 不大于1000,以及
  • x是y的除数
我的尝试:

listPairs::[(Int,Int)]

listPairs=[(a*b,y)| y因此,无限列表上的嵌套列表理解当然不会终止

幸运的是,您的列表不是无限的。这是有限制的。如果
x=a*b<500
,那么我们知道它一定是
a<500
b<500
。而且,
c=y*y<1001
只是
y<32

listPairs :: [(Int, Int)] 
listPairs = 
    [(x, c*c) | c <- [1..31], a <- [1..499],    -- a*b < 500 ==> b<500/a ,
                b <- [a..min 499 (div 500 a)],  -- a*b==b*a  ==> b >= a
                let x = a*b, x > 5,  
                -- (a*b) < 500, (c*c) < 1001,   -- no need to test this
                rem (c*c) x == 0]    
listPairs::[(Int,Int)]
列表对=
[(x,c*c)| c 5,
--(a*b)<500,(c*c)<1001,--无需对此进行测试
rem(c*c)x==0]
mod 0n==0
基本成立,所以我在这里从“自然数”中排除0

尽管我们在
x=a*b
中将
b
值限制为
b>=a
,这里仍然会产生一些重复项,因为
x
可以有多个表示(例如
1*6==2*3


你可以使用
Data.List.nub
来摆脱它们。

-1你已经从Haskell Cafe得到了大量的帮助,请不要从一个站点到另一个站点寻求帮助(Danny Gratzer)作为那些不知道我在说什么的人的参考,这是OP提出的,并在今天下午得到了详细的回答()
400
太低了。你应该确保没有遗漏任何正确的解决方案:
(a*b)5,a==1,b==499
是一致的。所以使用
[1..499]
0*x>5
从来都不是真的)。OTOH
(y*y)<1001
y<32
所以使用
ybtw你应该返回
[(a*b,y*y)|…
,根据您的描述。
y
代码是您描述的“c”。指定的副本回答了不同的问题。这个问题是具体的,那个问题是一般性的。