Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F#-从序列返回元素_F#_Seq - Fatal编程技术网

F#-从序列返回元素

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

剧透警报!您将看到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 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)