0

我需要生成一个数字列表,其中包含从这样的数字开始的500数字div 23 x == 7(其中x是数字)51。我不知道如何完成我的程序,所以如果有人可以帮助我,我会很高兴。程序不能接受参数,我的意思是例如required xs不允许。

required
   = do
      putStr "Required list is: "
      print [c x m n | c <- what goes here?, x <- [1 ..], div 23 x == 7, n <= 500 && m >= 51]
4

3 回答 3

3

你可以使用这个:

let theList = take 500 [x | x <- [51..], div 23 x == 7]
print theList

这似乎是一个非常简单的问题,所以我可能没有正确理解您的描述。

此外,只有一个数字div 23 x == 7,即 3 (因为23 / 3 ~= 7在整数算术中)。因此,您的列表将不包含 500 个元素,并且程序将冻结尝试查找列表中的元素。

(我提供了该问题的完整解决方案,因为提问者可能遇到了他未能描述的不同问题。)

于 2012-05-20T18:29:20.953 回答
1

take 500 (drop 50 [x | x <- [1..], div 23 x == 7]):首先生成您想要的数字列表,删除前 50 个(这样您最终得到第 51 个这样的数字),然后取出其中的 500 个。

正如 dflemstr 所说,只有一个数字使得 div 23 x == 7,所以我认为您可能的意思是mod x 23 == 7,即除以 23 时留下 7 的数字。在这种特殊情况下,更好的解决方案是map (\x -> 23 * x + 7) [50 .. 549],但这是错误的-易于; 我第一次尝试时出错了!

于 2012-05-20T19:07:08.770 回答
0

在这种情况下(包括我自己),通常首选使用列表理解作为 dflemstr 的答案生成列表。我假设您是 Haskell 的新手,所以我想详细说明您如何获取列表。结果应该是一样的。

注意:我的代码将无法放入 ghci 提示符,您需要创建 hs 文件并使用:l from ghci进行编译或加载

-- raw is [51, 52, 53, ... to infinity]
lst_raw = [51..]

-- you want only element that make this predicate True so just filter that do not out
lst_flt = filter (\x -> div 23 x == 7) raw

-- above list is infinite, want only first 500 element
mylist = take 500 lst_flt

或者您可以组合多行以摆脱不使用的中间绑定

mylist = take 500 $ filter (\x -> div 23 x == 7) [51..]

也只是对div 23 x部分感到好奇,因为div 23 xdiv x 23是不同的,看起来 div 23 x 永远不会得到任何值 == 7

> take 100 $ map (\x -> x `div` 23) [1..]
[0,0,0,0,0 ... 4,4,4,4]

> take 100 $ map (\x -> 23 `div` x) [1..]
[23,11,7,5,4,3,3 .... 0,0,0,0]
于 2013-01-30T11:33:39.660 回答