首页 > 解决方案 > 从序列 1,2,3,4,5 ......使用 Haskell 打印 1,5,9,13....

问题描述

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

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

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

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

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

标签: haskell

解决方案


如果您的目标是生成序列1, 5, 9, ...,那么您可以将其写为:

[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在这里可以说是“迭代器”,它表示对于每个n,我们访问4×n+1元素,因此您每次“跳过”三个元素:

obtain4_1 :: [a] -> [a]
obtain4_1 [] = []
obtain4_1 (x:xs) = x : go xs
    where go (_:_:_:ys) = obtain4_1 ys
          go _ = []

对于 items 列表[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,…

推荐阅读