递归函数:
let rec listMerge (l1 : 'a list) (l2 : 'a list) =
if l1.IsEmpty then l2
elif l2.IsEmpty then l1
else l1.Head :: l2.Head :: listMerge l1.Tail l2.Tail
现在,除非我很高兴地弄错了,否则这实际上并没有执行尾调用,如果不考虑这::
是正确的关联,它可能看起来像它。
然后,我的印象(从我读过的东西,但现在找不到)通过使用额外的fun
东西可以很容易地转换为尾递归。
那么,有可能吗?代码?
我的回答:所以,这就是我更改功能的方式,感谢以下答案:
let listMerge l1 l2 =
let rec mergeLoop (l1 : 'a list) (l2 : 'a list) acc =
if l1.IsEmpty then (List.rev acc) @ l2
elif l2.IsEmpty then (List.rev acc) @ l1
else mergeLoop l1.Tail l2.Tail (l2.Head :: l1.Head :: acc)
mergeLoop l1 l2 []