首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >F# -从序列返回元素

F# -从序列返回元素
EN

Stack Overflow用户
提问于 2016-05-10 08:57:49
回答 2查看 405关注 0票数 0

破坏者-警报!您将看到Projecteuler.net-问题7的解决方案。

如果这是重复的话,我很抱歉,但我在这里找不到一个同样的问题。

我在一个函数中计算一个数字序列,并希望返回第n个数字。

代码语言:javascript
复制
let isPrime x = 
    {2..x/2}
    |> Seq.exists (fun e -> x%e=0)
    |> not

let PrimeNumber nth = 
    let unfolder a =
        a
        |> Seq.unfold (fun e -> Some(e, e+1))
        |> Seq.find isPrime
        |> fun e -> Some(e, e)

    2
    |> Seq.unfold unfolder
    |> Seq.skip (nth-1) 
    |> Seq.head

let ans = PrimeNumber 10001

ans总是2,但为什么?

当我用PrimeNumber计算nth=10001中的最后一个表达式时,将返回正确的项。我是不是遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-10 09:13:21

问题在于您使用Seq.find。

Seq.find从文档中返回条件为真的第一个元素。在这种情况下,是2。

因此,您的解文件夹表达式将简单地生成一个无限序列的2s,因此,无论您采取什么元素,它将永远是一个2。

要查看此代码,只需运行以下代码片段:

代码语言:javascript
复制
2
|> Seq.unfold unfolder

//output: val it : seq<int> = seq [2; 2; 2; 2; ...]
票数 2
EN

Stack Overflow用户

发布于 2016-05-10 09:35:00

如果需要坚持此解决方案,则需要Seq.filter:

代码语言:javascript
复制
let isPrime x = 
{2..x/2}
|> Seq.exists (fun e -> x%e=0)
|> not

let PrimeNumber nth = 
    let unfolder a =
       a
       |> Seq.unfold (fun e -> Some(e, e+1))
       |> Seq.filter isPrime

    2
    |> unfolder
    |> Seq.skip (nth-1) 
    |> Seq.item 0

let ans = PrimeNumber 100会给你541,但在其他更有效的解决方案的评论中没有提到。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37133674

复制
相关文章

相似问题

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