对于Project Euler获得解决方案problem 2的最后一步,我有点卡住了。这是我到目前为止的来源。F中的项目欧拉问题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#,所以请保持温和,如果之前已经提出并回答过这类问题,请发布一个链接到答案,我会撤回这一个。
此外,您还可以用它代替折Seq.sum和周围纤维蛋白原的匿名函数是多余的(Seq.map蛋白原就足够了)。 – dahlbyk 2009-10-14 00:17:53
谢谢Brian。我对一件事很好奇 - 是不是Seq.filter使序列非无限? – 2009-10-14 00:23:07
否;我可以过滤从1,2,3,4,...和even的结果仍然无限2,4,... – Brian 2009-10-14 00:50:43