堆栈溢出和递归序列表达式 F#

Stack overflows and recursive sequence expressions F#

我有一个像这样的序列表达式:

let fibSeq = 
    let rec fibSeq' a b = 
        seq { yield a
              yield! fibSeq' b (a + b) }
    fibSeq' 1 1

现在即使对于大数,这也不会产生堆栈溢出。我想知道为什么,在我看来,要使用此序列表达式生成 n 斐波那契数,每个递归调用都需要 return 最终返回给调用者 "fold" 本身进入序列。幕后是否进行了某种优化?

是的,它叫做 "Tail Call Optimization" 看这里:http://blogs.msdn.com/b/chrsmith/archive/2008/08/07/understanding-tail-recursion.aspx 此外,Seq 是惰性的,因此它的第 500 个成员将不会被评估,直到您不必在程序中访问它,例如:

let elm = Seq.nth 500 fibSeq