関数の最後のステートメントが func(x,tailList) の場合:
def func(x:Int):List[Int]...
case head :: tailList => head :: func(x,tailList)
この関数を末尾再帰に変換するには、accumulator を 3 番目のパラメーターとして追加する必要があります (また、 func() 内にローカル関数を追加してきれいに保つため)。
insertTail(x,tailList,head::acc)
正しく動作していないようです。「acc」は進行中の計算を保持するべきではありませんか?
アキュムレータを使用してテール再帰的な作業を行うために、ここに何かが欠けていますか?
より完全な例を追加する
def funcTailTest(x:Int,xs:List[Int]):List[Int] = {
@tailrec
def inner(x:Int,xs:List[Int],acc:List[Int]) : List[Int] = xs match {
case head::tailList => {
inner(x,tailList,head::acc)
}
}
inner(x,xs,Nil)
}
基本的に head は inner() 関数の出力に追加する必要があるため、テールを再帰的にしようとしない場合、最後のステートメントは次のようになります。
head::inner(x,tailList)