像这样的一个简单的追加函数(在F#中):
let rec app s t =
match s with
| [] -> t
| (x::ss) -> x :: (app ss t)
如果s变得很大,该函数将崩溃,因为它不是尾递归的。我注意到F#的标准附加函数在处理大列表时不会崩溃,所以它必须是以不同的方式实现的。因此,我想知道:尾递归定义的附加函数是什么样子的?我想到了以下代码:
let rec comb s t =
match s with
| [] -> t
| (x::ss) -> comb ss (x::t)
let app2 s t = comb (List.rev s) t
这个方法虽然可行,但看起来有些奇怪。是否有更优雅的定义?
append3
比append2
更高效吗? - day