F#生成器功能相当

时间:2016-02-03 08:14:49

标签: 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);

这里fibgen是一个生成低于3000斐波纳契数的生成器。

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

LE:我不是在找algorithm for Fibonacci series。但是对于某些生成器函数,当迭代它时会懒惰地发出一个值。

1 个答案:

答案 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 - 如果评估得那么远。