在Project Euler上获得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;当我取消对最后一行的注释时,这个过程似乎永远不会结束。所以我希望有人能在正确的方向上给我一个温和的推动。我确实看过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;;但这并不管用。正如你可能猜到的那样,我只是在学习F#,所以请温柔点,如果之前有人问过和回答过这样的问题,请发布一个答案的链接,我会撤回这个问题。
发布于 2009-10-13 23:49:14
'setAllowedFibNos‘确实是一个无限的序列计算;'fold’需要整个序列,所以‘setAllowedFibNos’将永远运行,寻找另一个数字<= maxFib。
看看takeWhile:
http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/FSharp.Core/Microsoft.FSharp.Collections.Seq.html
我认为这是你想要的,而不是过滤器。
另请注意,您可以使用'sqrt 5.0‘。
发布于 2009-12-10 06:25:39
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发布于 2012-06-22 23:27:40
我的解决方案是:
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;;https://stackoverflow.com/questions/1563550
复制相似问题