在 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# 中的等效构造是什么?
请参阅此 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 的值——如果计算那么远。