堆栈溢出和递归序列表达式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