F# 生成器函数等效

Adr*_*ian 0 javascript f#

在 JavaScript 中,ES6 风格引入了生成器函数,因此这种构造是可能的:

var fib = function *(max) {
  var x = 0, y = 1, tmp = 1;
  while (tmp<max) {
    yield tmp;
    x = y; 
    y = tmp;
    tmp = x + y;
  }
}
var fibgen = fib(3000);
Run Code Online (Sandbox Code Playgroud)

fibgen是一个生成少于 3000 个斐波那契数的生成器。

F# 中的等效构造是什么?

LE:我不是在寻找斐波那契数列算法。但是对于某些在迭代时会懒惰地发出值的生成器函数。

Van*_*oiy 5

请参阅此 MSDN 文章,了解 F# 中的惰性求值序列。给定问题的可能解决方案,使用Seq.unfold

let fibTo limit =
    Seq.unfold (fun (a, b) -> Some (b, (b, a+b))) (0I, 1I)
    |> Seq.takeWhile (fun i -> i <= limit)
Run Code Online (Sandbox Code Playgroud)

第一行创建了斐波那契数列,懒惰地计算。第二个限制它。I是任意长度整数的文字。测试:

fibTo 3000I |> Seq.iter (printf "%A ")
Run Code Online (Sandbox Code Playgroud)

输出: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584

fibTo (pown 10I 30)
Run Code Online (Sandbox Code Playgroud)

返回最多 898923707008479989274290850145 的斐波那契数列——最后一个不大于 10^30 的值——如果计算那么远。