Ove*_*ive 5 recursion f# tail-recursion fibonacci lazy-sequences
我有一个像这样的序列表达式:
let fibSeq =
let rec fibSeq' a b =
seq { yield a
yield! fibSeq' b (a + b) }
fibSeq' 1 1
Run Code Online (Sandbox Code Playgroud)
现在,即使对于很大的数字,这也不会产生堆栈溢出。我想知道为什么,在我看来,要使用此序列表达式生成n 个斐波那契数,每个递归调用都需要返回到调用者,最终将其自身“折叠”到序列中。这里是否有某种优化在幕后进行?
是的,它被称为“尾部调用优化”请参见此处: http: //blogs.msdn.com/b/chrsmith/archive/2008/08/07/understanding-tail-recursion.aspx 另外,Seq 是惰性的,因此它的第 500 个成员将除非您不必在程序中访问它,否则不会对其进行评估,例如:
let elm = Seq.nth 500 fibSeq
Run Code Online (Sandbox Code Playgroud)