像这样的简单附加函数(在 F# 中):
let rec app s t =
match s with
| [] -> t
| (x::ss) -> x :: (app ss t)
当 s 变大时会崩溃,因为该函数不是尾递归的。我注意到 F# 的标准 append 函数不会因大列表而崩溃,因此必须以不同的方式实现它。所以我想知道:追加的尾递归定义是什么样的?我想出了这样的事情:
let rec comb s t =
match s with
| [] -> t
| (x::ss) -> comb ss (x::t)
let app2 s t = comb (List.rev s) t
这有效,但看起来很奇怪。有更优雅的定义吗?