首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Seq.unfold对F#的解释

Seq.unfold对F#的解释
EN

Stack Overflow用户
提问于 2009-02-10 18:51:02
回答 4查看 6.4K关注 0票数 5

我正在尝试使用F#懒洋洋地创建一个序列。

顺序的定义如下:

三角形数列的第n项由,tn =-n(n+1)给出,所以前十个三角形数是: 1、3、6、10、15、21、28、36、45、55、.

到目前为止,我的情况是这样的,但似乎行不通:

代码语言:javascript
复制
let tri_seq = 1.0 |> Seq.unfold (fun x -> match x with                                         
                                          | _ -> Some (x, 0.5*x*(x + 1.0)))

非常感谢你,谁能帮我弄清楚如何展开工作。谢谢

编辑:,我把第一个答案标记为正确,但它不起作用,但是我稍微修改了一下,它起了作用。

代码语言:javascript
复制
let tri_seq = 1.0 |> Seq.unfold (fun x -> Some (0.5 * x * (x + 1.0),x + 1.0))
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-02-10 18:57:32

首先,如果只有一种情况,为什么要使用match

代码语言:javascript
复制
let tri_seq = 1.0 |> Seq.unfold (fun x -> Some (x, 0.5 * x * (x + 1.0)))

第二,什么“似乎不起作用”?你知道你产生了一个无限的列表吗?

/Edit:为了完整起见,下面是正确的解决方案,OP找到了这个解决方案,并将其作为评论发布:

代码语言:javascript
复制
let tri_seq = 
    1.0 |> Seq.unfold (fun x -> Some (0.5 * x * (x + 1.0), x + 1.0))
票数 8
EN

Stack Overflow用户

发布于 2009-02-10 23:51:19

Brian发布的代码的另一个替代方法是使用递归,而不是命令式'while‘循环:

代码语言:javascript
复制
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)

它的效率要低得多(所以您在这里要小心一点.),但是它是更惯用的函数式解决方案,所以可能更容易看出代码的作用。

票数 4
EN

Stack Overflow用户

发布于 2009-02-10 19:12:06

以下是另一种选择:

代码语言:javascript
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/533633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档