我有一个像这样的序列表达式:
let fibSeq =
let rec fibSeq' a b =
seq { yield a
yield! fibSeq' b (a + b) }
fibSeq' 1 1
现在即使对于大数字,不也会产生堆栈溢出。我想知道为什么,在我看来,用这个序列表达式生成 n Fibonacci数字,每个递归调用都需要返回给调用者最终到" fold"本身进入序列。幕后是否会进行某种优化?
答案 0 :(得分:3)
是的,它被称为"尾部呼叫优化" 见这里:http://blogs.msdn.com/b/chrsmith/archive/2008/08/07/understanding-tail-recursion.aspx Seq也是懒惰的,所以在您不必在程序中访问它之前,它的第500个成员将不会被评估:
let elm = Seq.nth 500 fibSeq