函数式编程语言的软件开发人员被告知尾递归调用比非尾递归调用更好。教科书中的一个经典例子是尾递归阶乘函数(用 F# 编写)
let rec faci n r =
if n = 0 then r else faci (n-1) (r * n)
与其非尾递归对应部分。
let rec facr n =
if n = 0 then 1 else n * facr(n-1)
相对清楚的是,faci
上面调用自身时不需要额外的堆栈帧facr
。但我正在寻找一个更生动的例子,最好在 F# 中,从中可以证明为什么尾递归函数比非尾递归函数更好。理想情况下,改进可以可视化,例如,使用内存分析器,或通过打印一些调试信息。对这样的例子有任何想法吗?