F# F中的欧拉问题2#

F# F中的欧拉问题2#,f#,F#,我在欧拉计划的最后一步有点卡住了。这是我到目前为止得到的消息来源 #light module pe2 (* Project Euler Problem 2 solution *) open System let Phi = 1.6180339887;; let invPhi = 1.0/Phi;; let rootOfFive = 2.236067977;; let maxFib = 4000000.0; let Fib n = System.Mat

我在欧拉计划的最后一步有点卡住了。这是我到目前为止得到的消息来源

#light
module pe2 (* Project Euler Problem 2 solution *)

  open System

  let Phi = 1.6180339887;;

  let invPhi = 1.0/Phi;;

  let rootOfFive = 2.236067977;;

  let maxFib = 4000000.0;

  let Fib n =
     System.Math.Round((Phi**n - invPhi**n)/rootOfFive);;

  let FibIndices = Seq.unfold(fun i -> Some(i, i+3.0)) 3.0;;

  let FibNos = FibIndices |> Seq.map(fun index -> Fib(index));;

  let setAllowedFibNos = FibNos |> Seq.filter(fun fn -> (fn <= maxFib));;

//   let answer = setAllowedFibNos |> Seq.fold (+) 0.0;
#灯
模块pe2(*项目Euler问题2解决方案*)
开放系统
设φ=1.6180339887;;
设invPhi=1.0/Phi;;
设rootofive=2.236067977;;
设maxFib=4000000.0;
让Fib n=
System.Math.Round((Phi**n-invPhi**n)/rootoffe);;
让FibIndex=Seq.展开(乐趣i->Some(i,i+3.0))3.0;;
设FibNos=fibIndex |>Seq.map(乐趣指数->Fib(指数));;
设setAllowedFibNos=FibNos |>序列过滤器(fun-fn->(fn-Seq.fold(+)0.0;
当我取消最后一行的注释时,这个过程似乎永远不会结束。所以我希望有人能在正确的方向上轻轻推我一下。我确实看了setAllowedFibNos,它看起来是正确的,但它也是一个无限序列,所以我只看到前三个术语

还有,有人能给我指出将各种序列链接在一起的正确方法吗?我试过这样的方法:

let answer = Seq.unfold(fun i-> Some(i, i + 3.0)) 3.0 
|> Seq.map (fun index -> Fib(index))
|> Seq.filter(fun fn -> (fn <= maxFib))
|> Seq.fold (+) 0.0;;
let answer=Seq.unfold(乐趣i->Some(i,i+3.0))3.0
|>Seq.map(乐趣指数->Fib(指数))
|>序列过滤器(fn->(fn序列折叠(+)0.0;);;

但是这不起作用。你可能猜到我只是在学习F#所以请温和一点,如果以前有人问过并回答过这类问题,请发一个链接到答案,我会收回这一个。

'setAllowedFibNos'确实是一个无限序列计算;'fold'需要整个序列,所以'filter'将永远运行寻找另一个数字我仍在尝试适应Seq方法。但是,这里是我没有它的解决方案


#light
let rec fib n =
  match n with
  |0|1 -> n
  |_ -> fib(n-1) + fib(n-2)

let maxFib = 4000000
let phi = (1.0 + sqrt(5.0)) / 2.0
let upperBound = 1 + int( log10((float(maxFib) - 0.5) * sqrt(5.0)) / log10(phi)) 

[1..upperBound] |> List.filter (fun x-> x%3=0) |> List.map fib |> List.filter (fun x -> x%2 = 0) |> List.filter (fun x -> x List.sum |> printfn "%d"
let rec Fib(n)=
如果(n<2),则
1.
其他的
Fib(n-2)+Fib(n-1)
Seq.initfib
|>Seq.takeWhile(fun a->a Seq.filter(fun a->(a%2)=0)
|>序号折叠(+)0
我的解决方案是:

Seq.unfold (fun state ->
    if (fst state + snd state > 4000000) then None
    else Some(fst state + snd state, (snd state, fst state + snd state))) (0,1)
|> Seq.filter (fun x -> x % 2 = 0) 
|> Seq.sum;;

另外,您可以使用Seq.sum而不是fold,并且围绕Fib的匿名函数是多余的(Seq.map Fib就足够了).谢谢Brian.我对一件事很好奇--Seq.filter不是让序列变为非无限的吗?不,我可以只过滤1,2,3,4…中的evens,结果仍然是无限的2,4,…比较你的解决方案是有意义的。即使在这个玩具问题的规模下,它也遵循更多的构建通用函数,然后由我们得到具体的结果按照这种“将函数粘在一起”的方式,您不应该将终止条件嵌入到
序列展开
生成器函数中,而是按照特定
4000000
需求缓慢地计算不定长序列。
Seq.unfold (fun state ->
    if (fst state + snd state > 4000000) then None
    else Some(fst state + snd state, (snd state, fst state + snd state))) (0,1)
|> Seq.filter (fun x -> x % 2 = 0) 
|> Seq.sum;;