首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >F#中的项目欧拉问题2

F#中的项目欧拉问题2
EN

Stack Overflow用户
提问于 2009-10-13 23:42:35
回答 3查看 794关注 0票数 0

在Project Euler上获得problem 2的解决方案的最后一步中,我有点卡住了。这是我到目前为止得到的资源。

代码语言:javascript
复制
#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,它看起来是对的,但它也是一个无限序列,所以我只看到了前三项。

另外,有人能告诉我把不同的序列链接在一起的正确方法吗?我尝试了这样的东西:

代码语言:javascript
复制
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#,所以请温柔点,如果之前有人问过和回答过这样的问题,请发布一个答案的链接,我会撤回这个问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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‘。

票数 3
EN

Stack Overflow用户

发布于 2009-12-10 06:25:39

代码语言:javascript
复制
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
票数 4
EN

Stack Overflow用户

发布于 2012-06-22 23:27:40

我的解决方案是:

代码语言:javascript
复制
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;;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1563550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档