使用Haskell从序列1,2,3,4,5 ...打印1,5,9,13…

问题描述 投票:0回答:2

我必须使用Haskell从自然数[1,2,3 .....]的列表中创建每4n + 1项的列表

我可以使用一些示例编写此程序:

elem' n xs = case drop (4*n) xs of
              (y:ys) -> y : elem' n ys
              [] -> []

这将生成原始列表中每n个元素的列表。

但是我的代码没有给出正确的结果。谁能指出问题出在哪里?我不应该使用drop并进行一些递归吗?

haskell
2个回答
0
投票

如果要生成序列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,…

如果要获得这些索引处的元素,则可能不需要nn在这里可以说是“ 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,…

0
投票

利用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个元素,则可以为此编写一个辅助函数。

© www.soinside.com 2019 - 2024. All rights reserved.