0

関数の最後のステートメントが 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)
4

2 に答える 2

1

reverse も末尾再帰的に実装されていると仮定すると (確実にそうなる可能性があります)、以下は末尾再帰的追加です:

def append[T](y: T, xs: List[T]): List[T] = {
  @tailrec
  def appendAcc[T](y: T, xs: List[T], acc: List[T]): List[T] = xs match {
    case Nil => y :: acc
    case x :: xs => appendAcc(y, xs, x :: acc)
  }

  appendAcc(y, xs, Nil).reverse
}
于 2012-07-25T14:16:51.413 に答える
1

以下は、cons 演算子を使用して Tail 再帰を実装するためのスカラ関数です。

def reverseUtility(ele: List[Int], res: List[Int]):List[Int] ={
  ele match {
  case Nil => Nil
  case x :: Nil => x :: res
  case x :: y => reverseUtility(y, (x::res))
}}

関数のパラメーターとしてInt呼び出されるリストと空のリストを渡します。res(result)関数の時間計算量は O(N) です

于 2015-05-13T10:31:38.223 に答える