堆栈溢出和递归序列表达式 F#
Stack overflows and recursive sequence expressions F#
我有一个像这样的序列表达式:
let fibSeq =
let rec fibSeq' a b =
seq { yield a
yield! fibSeq' b (a + b) }
fibSeq' 1 1
现在即使对于大数,这也不会产生堆栈溢出。我想知道为什么,在我看来,要使用此序列表达式生成 n 斐波那契数,每个递归调用都需要 return 最终返回给调用者 "fold" 本身进入序列。幕后是否进行了某种优化?
是的,它叫做 "Tail Call Optimization"
看这里:http://blogs.msdn.com/b/chrsmith/archive/2008/08/07/understanding-tail-recursion.aspx
此外,Seq 是惰性的,因此它的第 500 个成员将不会被评估,直到您不必在程序中访问它,例如:
let elm = Seq.nth 500 fibSeq
我有一个像这样的序列表达式:
let fibSeq =
let rec fibSeq' a b =
seq { yield a
yield! fibSeq' b (a + b) }
fibSeq' 1 1
现在即使对于大数,这也不会产生堆栈溢出。我想知道为什么,在我看来,要使用此序列表达式生成 n 斐波那契数,每个递归调用都需要 return 最终返回给调用者 "fold" 本身进入序列。幕后是否进行了某种优化?
是的,它叫做 "Tail Call Optimization" 看这里:http://blogs.msdn.com/b/chrsmith/archive/2008/08/07/understanding-tail-recursion.aspx 此外,Seq 是惰性的,因此它的第 500 个成员将不会被评估,直到您不必在程序中访问它,例如:
let elm = Seq.nth 500 fibSeq