破坏者-警报!您将看到Projecteuler.net-问题7的解决方案。
如果这是重复的话,我很抱歉,但我在这里找不到一个同样的问题。
我在一个函数中计算一个数字序列,并希望返回第n个数字。
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 10001ans总是2,但为什么?
当我用PrimeNumber计算nth=10001中的最后一个表达式时,将返回正确的项。我是不是遗漏了什么?
发布于 2016-05-10 09:13:21
问题在于您使用Seq.find。
Seq.find从文档中返回条件为真的第一个元素。在这种情况下,是2。
因此,您的解文件夹表达式将简单地生成一个无限序列的2s,因此,无论您采取什么元素,它将永远是一个2。
要查看此代码,只需运行以下代码片段:
2
|> Seq.unfold unfolder
//output: val it : seq<int> = seq [2; 2; 2; 2; ...]发布于 2016-05-10 09:35:00
如果需要坚持此解决方案,则需要Seq.filter:
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 0let ans = PrimeNumber 100会给你541,但在其他更有效的解决方案的评论中没有提到。
https://stackoverflow.com/questions/37133674
复制相似问题