F# - Return 序列中的元素
F# - Return element from sequence
剧透警告!您将看到 projecteuler.net-问题 7 的解决方案。
很抱歉,如果这是重复的,但我在这里找不到问同样问题的问题。
我在一个函数中计算了一个数字序列,想要 return 第 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 10001
ans
永远是 2,但为什么?
当我用 nth=10001
计算 PrimeNumber
中的最后一个表达式时,正确的项目是 returned。我错过了什么吗?
问题出在你使用Seq.find。
Seq.find,从文档中,returns 第一个 条件为真的元素。在这种情况下,即 2。
因此,您的展开表达式将简单地生成一个无限的 2 序列,因此无论您采用什么元素,它始终是一个 2。
要查看此内容,运行 只需这段代码:
2
|> Seq.unfold unfolder
//output: val it : seq<int> = seq [2; 2; 2; 2; ...]
如果你需要坚持这个解决方案,你想要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 0
let ans = PrimeNumber 100
会给你541
但正如评论中所回避的那样,其他更有效的解决方案。
剧透警告!您将看到 projecteuler.net-问题 7 的解决方案。
很抱歉,如果这是重复的,但我在这里找不到问同样问题的问题。
我在一个函数中计算了一个数字序列,想要 return 第 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 10001
ans
永远是 2,但为什么?
当我用 nth=10001
计算 PrimeNumber
中的最后一个表达式时,正确的项目是 returned。我错过了什么吗?
问题出在你使用Seq.find。
Seq.find,从文档中,returns 第一个 条件为真的元素。在这种情况下,即 2。
因此,您的展开表达式将简单地生成一个无限的 2 序列,因此无论您采用什么元素,它始终是一个 2。
要查看此内容,运行 只需这段代码:
2
|> Seq.unfold unfolder
//output: val it : seq<int> = seq [2; 2; 2; 2; ...]
如果你需要坚持这个解决方案,你想要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 0
let ans = PrimeNumber 100
会给你541
但正如评论中所回避的那样,其他更有效的解决方案。