代码之家  ›  专栏  ›  技术社区  ›  Onorio Catenacci

F中的欧拉问题2#

f#
  •  0
  • Onorio Catenacci  · 技术社区  · 15 年前

    在解决问题的最后一步上,我有点不知所措 problem 2

    #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;
    

    还有,有人能告诉我把各种序列链接在一起的正确方法吗?我试过这样的方法:

    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;;
    

    4 回复  |  直到 10 年前
        1
  •  3
  •   Brian    15 年前

    “setAllowedFibNos”实际上是一个无限序列计算;'“fold”需要整个序列,因此“filter”将永远运行以查找另一个数字<=麦克斯菲。

    请看takeWhile:

    http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/FSharp.Core/Microsoft.FSharp.Collections.Seq.html

    还请注意,您可以使用“sqrt 5.0”。

        2
  •  4
  •   Johan    15 年前
    let rec Fib(n) = 
        if (n < 2) then
            1
        else
            Fib(n-2) + Fib(n-1)
    
    Seq.initInfinite Fib
    |> Seq.takeWhile (fun a -> a <= 4000000)
    |> Seq.filter (fun a -> (a % 2) = 0)
    |> Seq.fold (+) 0
    
        3
  •  0
  •   Cygwin98    15 年前

    我仍在努力适应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"
    
    
        4
  •  0
  •   Evgeny Lazin    12 年前

    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;;