F # Создать список кратных х? - PullRequest
3 голосов
/ 29 сентября 2011

Я хочу создать список, кратный числу. Например, [2; 4; 6; 8; 10] будет кратно 2 от 0 до 10.

Как мне динамически создать такой список, кратный x? Возможно ли это сделать без установки верхней границы?

Один из способов сделать это - создать список от 0 до сумасшедшего большого числа, а затем отфильтровать его с помощью функции мода. Попытка проверить это, создание списка от 0 до какого-то сумасшедшего большого числа, вызвало исключение нехватки памяти (примерно через 30 секунд ожидания).

Я чувствую, что у F # есть какой-то очень простой и удивительный способ создать такой список, но я слишком новичок, чтобы знать, что это такое, пока. Помощь

Ответы [ 4 ]

3 голосов
/ 29 сентября 2011

Это производит бесконечную последовательность кратных:

let multiples n = Seq.unfold (fun i -> Some(i, i + n)) n

multiples 3 |> Seq.take 3 //seq [3; 6; 9]

Это немного больше кода, но быстрее:

let multiples n =
  let rec loop i =
    seq {
      yield i
      yield! loop (i + n)
    }
  loop n

Это в основном эквивалентно следующему C #:

static IEnumerable<int> Multiples(int n) {
    int i = n;
    while (true) {
        yield return i;
        i += n;
    }
}
3 голосов
/ 29 сентября 2011

Последовательности (IEnumerables) дают желаемую лень здесь:

let multiplesOfN n =
    seq {
        for i in 1 .. 1000000 do
            yield i * n
    }

let first6multsof3 = 
    multiplesOfN 3 |> Seq.take 6

printfn "%A" (first6multsof3 |> Seq.toList)

или с вашей стратегией filter-mod:

seq { 1 .. 1000000} |> Seq.filter (fun x -> x%3=0) |> Seq.take 6 |> Seq.toList 
1 голос
/ 30 сентября 2011
[ firstValue..Step..endValue]

[2..2..10] => [2; 4; 6; 8; 10]

другой способ

Seq.initInfinite id |> Seq.map (((+) 1) >> ((*) 2))
1 голос
/ 29 сентября 2011
List.init 10 ((*) 3)
val it : int list = [0; 3; 6; 9; 12; 15; 18; 21; 24; 27]

Вы можете поиграть с аргументами и Seq.skip, чтобы получить все, что вам нужно.

Например, для [2; 4; 6; 8; 10]:

List.init 6 ((*) 2)
|> List.tail

Или:

List.init 6 ((*) 2)
|> Seq.skip 1
|> List.ofSeq
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...