F#-从序列返回元素
剧透警报!您将看到projecteuler.net问题7的解决方案 如果这是重复的话,我很抱歉,但我在这里找不到提出同样问题的问题 我计算一个函数中的数字序列,并返回第n个数字F#-从序列返回元素,f#,seq,F#,Seq,剧透警报!您将看到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.unf
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
中的最后一个表达式时,返回正确的项。我遗漏了什么吗?问题在于您对Seq.find的使用
Seq.find从文档中返回条件为true的第一个元素。在这种情况下,这是2
因此,您的展开器表达式将简单地生成一个2的无限序列,因此无论您使用什么元素,它都将始终是2
要查看这一点,只需运行以下代码片段:
2
|> Seq.unfold unfolder
//output: val it : seq<int> = seq [2; 2; 2; 2; ...]
2
|>顺序:展开展开器
//输出:val it:seq=seq[2;2;2;2;…]
问题在于您对Seq.find的使用
Seq.find从文档中返回条件为true的第一个元素。在这种情况下,这是2
因此,您的展开器表达式将简单地生成一个2的无限序列,因此无论您使用什么元素,它都将始终是2
要查看这一点,只需运行以下代码片段:
2
|> Seq.unfold unfolder
//output: val it : seq<int> = seq [2; 2; 2; 2; ...]
2
|>顺序:展开展开器
//输出:val it:seq=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
让ans=PrimeNumber 100
将为您提供541
但正如评论中所回避的那样,这是其他更有效的解决方案 如果您需要坚持使用此解决方案,则需要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
让ans=PrimeNumber 100
将为您提供541
但正如评论中所回避的那样,这是其他更有效的解决方案 将
|>fune e->Some(e,e)
更改为|>fune e->Some(e,e+1)
修复了它。谢谢你的提示。重新启动visual studio后,它的计算结果不是正确的解决方案。我不知道它以前为什么起作用。@Micha90:重新考虑e+1
——这将毫无意义地测试每个偶数。你有什么建议?当我从2开始时,e+2跳过3作为素数。它还产生了错误的解,n+1素数。它跑得不快,但我不明白为什么。我希望它的运行速度是~的两倍。@Micha90:从3开始,手动将2
注入序列的头部;e、 g.2 |>Seq.unfold unfolder |>Seq.skip(nth-1)
变为3 |>Seq.unfold unfolder |>Seq.append(Seq.singleton 2)|>Seq.skip(nth-1)
。将>fun e->一些(e,e)
更改为>fun e->一些(e,e+1)
修复了它。谢谢你的提示。重新启动visual studio后,它的计算结果不是正确的解决方案。我不知道它以前为什么起作用。@Micha90:重新考虑e+1
——这将毫无意义地测试每个偶数。你有什么建议?当我从2开始时,e+2跳过3作为素数。它还产生了错误的解,n+1素数。它跑得不快,但我不明白为什么。我希望它的运行速度是~的两倍。@Micha90:从3开始,手动将2
注入序列的头部;e、 g.2 |>Seq.unfold unfolder |>Seq.skip(nth-1)
变为3 |>Seq.unfold unfolder |>Seq.append(Seq.singleton 2)|>Seq.skip(nth-1)
。