如何使用 F# 对斐波那契列表中的偶数求和

How to sum even numbers in a fibonacci list with F#

我正在通过 Project Euler 进行更多 F# 练习,但我对语法或 seq 的某些东西很着迷。我不明白的是我的第一种方法是如何失败的:

let generateFibonacci limit =
    let rec genFib a b =
        if a + b < limit then
            seq {
                yield a
                yield! genFib b (a + b)
            }
        else
            []

    genFib 1 2 |> Seq.cache

let getEvenFibsSum =
    generateFibonacci 4_000_000
    |> Seq.filter (fun i -> i % 2 = 0)
    |> Seq.sum

printfn "sum of even fibs: %i" getEvenFibsSum
// result from above is: 1089154
// expected to see: 4613732

我正在递归迭代,检查模运算符是否为偶数,并对序列求和。从理论上讲,这应该可以很好地解决问题。我还打印出 fib 序列作为测试,它看起来是正确的。但是,总和显然太低了。有人可以指出我在做什么的漏洞吗?有些东西允许跳过或未达到数字,但我还没有看到。也感谢任何提示或建议。

ab 的总和超过 limit 时您将停止,但这太早了,因为您仍然需要 yield a。如果将测试更改为 if a < limit then ...,它可以正常工作:

let generateFibonacci limit =
    let rec genFib a b =
        if a < limit then
            seq {
                yield a
                yield! genFib b (a + b)
            }
        else
            Seq.empty

    genFib 1 2 |> Seq.cache

let getEvenFibsSum =
    generateFibonacci 4_000_000
    |> Seq.filter (fun i -> i % 2 = 0)
    |> Seq.sum

printfn "sum of even fibs: %i" getEvenFibsSum   // 4613732