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

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


现在即使是大量数据,也不会产生堆栈溢出。我想知道为什么要在此序列表达式中生成n个斐波那契数,每个递归调用最终都需要返回给调用者,以将其自身“折叠”到序列中。这里的幕后是否进行了某种优化?

最佳答案

是的,它被称为“尾部呼叫优化”
看到这里:http://blogs.msdn.com/b/chrsmith/archive/2008/08/07/understanding-tail-recursion.aspx
另外,Seq是惰性的,因此直到您不必在程序中访问它时,才会评估其第500个成员:

let elm = Seq.nth 500 fibSeq

关于recursion - 堆栈溢出和递归序列表达式F#,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27969151/

10-10 18:24