F # Использование рекурсивных списков - PullRequest
2 голосов
/ 11 ноября 2011

Мой код (ниже) падает с исключением переполнения стека.Я предполагаю, что F # не похож на haskell, а dosent хорошо работают с рекурсивными списками.Как правильно работать с рекурсивными списками, подобными этим, в F #?Должен ли я передать ему int, чтобы он имел определенный размер?

let rec collatz num =
    match num with 
        |x when x % 2 = 0 ->num :: collatz (x/2)                                            
        |x ->               num :: collatz ((x * 3) + 1)

let smallList = collatz(4) |> Seq.take(4)

Ответы [ 2 ]

5 голосов
/ 11 ноября 2011

Для такого бесконечного списка вы хотите вернуть последовательность. Последовательности ленивы; списки не.

let rec collatz num = 
  seq {
    yield num
    match num with 
    | x when x % 2 = 0 -> yield! collatz (x/2)                                            
    | x -> yield! collatz ((x * 3) + 1)
  }

let smallList = 
  collatz 4
  |> Seq.take 4
  |> Seq.toList //[4; 2; 1; 4]
0 голосов
/ 11 ноября 2011
let collatz num =
  let next x = if x % 2 = 0 then x / 2 else x * 3 + 1
  (num, next num)
  |>Seq.unfold  (fun (n, x) -> Some (n, (x, next x)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...