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

我有这样的序列表达式:

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
链接地址: http://www.djcxy.com/p/80619.html

上一篇: Stack overflows and recursive sequence expressions F#

下一篇: Recursive function causing an overflow despite it's not infinite