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

时间:2015-01-15 17:16:01

标签: recursion f# fibonacci tail-recursion lazy-sequences

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

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

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

1 个答案:

答案 0 :(得分:3)

是的,它被称为"尾部呼叫优化" 见这里:http://blogs.msdn.com/b/chrsmith/archive/2008/08/07/understanding-tail-recursion.aspx Seq也是懒惰的,所以在您不必在程序中访问它之前,它的第500个成员将不会被评估:

let elm = Seq.nth 500 fibSeq