Выведите 1,5,9,13 .... из последовательности 1,2,3,4,5 ..... используя Haskell - PullRequest
1 голос
/ 06 мая 2020

Мне нужно создать список из каждого 4n + 1 члена из списка натуральных чисел [1,2,3 .....], используя Haskell

Я мог бы написать эту программу, используя некоторые примеры:

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

Это сгенерирует список из каждого n-го элемента в исходном списке.

Но мой код не дает правильного результата. Кто-нибудь может указать, где что-то не так? Не следует ли мне использовать drop и сделать рекурсию?

Ответы [ 3 ]

3 голосов
/ 06 мая 2020

Если вы стремитесь сгенерировать последовательность 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 _ = []

Для списка элементов [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,…
1 голос
/ 06 мая 2020

Принимая во внимание haskell Понимание списка , вы можете написать такую ​​функцию:

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-й элемент сгенерированного списка, вы можете написать вспомогательную функцию для этого .

0 голосов
/ 07 мая 2020

Я бы предложил использовать рекурсию по бесконечному списку. Что-то вроде этого должно помочь.

run :: [Int] -> [Int]
run (x:xs) = x : run (drop 3 xs)

Помните, что run возвращает бесконечный список, поэтому вы должны брать только конечное число элементов.

take 10 $ run [1..]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...