再帰関数:
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 []