在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);
这里fibgen
是一个生成低于3000斐波纳契数的生成器。
F#中的等效构造是什么?
LE:我不是在找algorithm for Fibonacci series。但是对于某些生成器函数,当迭代它时会懒惰地发出一个值。
答案 0 :(得分:3)
见this MSDN article for lazily evaluated sequences in F#。使用Seq.unfold
:
let fibTo limit =
Seq.unfold (fun (a, b) -> Some (b, (b, a+b))) (0I, 1I)
|> Seq.takeWhile (fun i -> i <= limit)
第一行创建斐波那契序列,懒惰地评估。第二个限制它。 I
是任意长度整数的文字。测试:
fibTo 3000I |> Seq.iter (printf "%A ")
输出:1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584
fibTo (pown 10I 30)
返回最大为898923707008479989274290850145的Fibonnaci序列 - 最后一个值不大于10 ^ 30 - 如果评估得那么远。