我必须使用Haskell从自然数[1,2,3 .....]的列表中创建每4n + 1项的列表
我可以使用一些示例编写此程序:
elem' n xs = case drop (4*n) xs of
(y:ys) -> y : elem' n ys
[] -> []
这将生成原始列表中每n个元素的列表。
但是我的代码没有给出正确的结果。谁能指出问题出在哪里?我不应该使用drop并进行一些递归吗?
如果要生成序列1、5、9和&hillip;,则可以将其写为:
[1, 5 .. ]
实际上,这会生成一个列表,如:
Prelude> [1, 5 .. ]
[1,5,9,13,17,21,25,29,33,37,41,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121,125,129,133,137,141,145,149,153,157,161,165,169,173,177,…
如果要获得这些索引处的元素,则可能不需要n
。 n在这里可以说是“ iterator”,它表示对于每个n,我们访问4×n + 1元素,因此您可以“跳过”每个元素时间三要素:
obtain4_1 :: [a] -> [a]
obtain4_1 [] = []
obtain4_1 (x:xs) = x : go xs
where go (_:_:_:ys) = obtain4_1 ys
go _ = []
对于项目列表[1..]
,这给了我们相同的值:
Prelude> obtain4_1 [1..]
[1,5,9,13,17,21,25,29,33,37,41,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121,125,129,133,137,141,145,149,153,157,161,165,169,173,177,181,…
利用haskell List Comprehension的优势,您可以编写如下函数:
obtain :: Int -> Int -> [Int]
obtain 0 _ = []
obtain n x = [ a * x + 1| a<-[0..n] ]
使用n,我们传递想要的列表中的多少项,使用x,您可以生成(x * i +1)个安全性。
示例测试用例:
*Main> obtain 10 4
[1,5,9,13,17,21,25,29,33,37,41]
*Main> obtain 10 3
[1,4,7,10,13,16,19,22,25,28,31]
*Main> obtain 10 2
[1,3,5,7,9,11,13,15,17,19,21]
*Main> obtain 15 2
[1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31]
*Main> obtain 5 1
[1,2,3,4,5,6]
如果需要生成列表的第n个元素,则可以为此编写一个辅助函数。