我正在尝试使用F#懒洋洋地创建一个序列。
顺序的定义如下:
三角形数列的第n项由,tn =-n(n+1)给出,所以前十个三角形数是: 1、3、6、10、15、21、28、36、45、55、.
到目前为止,我的情况是这样的,但似乎行不通:
let tri_seq = 1.0 |> Seq.unfold (fun x -> match x with
| _ -> Some (x, 0.5*x*(x + 1.0)))非常感谢你,谁能帮我弄清楚如何展开工作。谢谢
编辑:,我把第一个答案标记为正确,但它不起作用,但是我稍微修改了一下,它起了作用。
let tri_seq = 1.0 |> Seq.unfold (fun x -> Some (0.5 * x * (x + 1.0),x + 1.0))发布于 2009-02-10 18:57:32
首先,如果只有一种情况,为什么要使用match?
let tri_seq = 1.0 |> Seq.unfold (fun x -> Some (x, 0.5 * x * (x + 1.0)))第二,什么“似乎不起作用”?你知道你产生了一个无限的列表吗?
/Edit:为了完整起见,下面是正确的解决方案,OP找到了这个解决方案,并将其作为评论发布:
let tri_seq =
1.0 |> Seq.unfold (fun x -> Some (0.5 * x * (x + 1.0), x + 1.0))发布于 2009-02-10 23:51:19
Brian发布的代码的另一个替代方法是使用递归,而不是命令式'while‘循环:
let tri =
let rec loop(n, diff) = seq {
yield n
yield! loop(n + diff, diff + 1.0) }
loop(1.0, 2.0)
printfn "%A" (tri |> Seq.take 10 |> Seq.to_list)它的效率要低得多(所以您在这里要小心一点.),但是它是更惯用的函数式解决方案,所以可能更容易看出代码的作用。
发布于 2009-02-10 19:12:06
以下是另一种选择:
let tri = seq {
let n = ref 1.0
let diff = ref 2.0
while true do
yield !n
n := !n + !diff
diff := !diff + 1.0
}
printfn "%A" (tri |> Seq.take 10 |> Seq.to_list)https://stackoverflow.com/questions/533633
复制相似问题