我的代码(下面)因堆栈溢出异常而失败。我假设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)
答案 0 :(得分:5)
对于这样的无限列表,您希望返回一个序列。序列是懒惰的;列表不是。
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]
答案 1 :(得分:0)
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)))