2017-01-09 10 views
0

次のコード例は、「ツイート」を管理するバイナリツリーの例の一部を示しています。ツリーの各ノードは、それが述語(p)に適合するかどうかチェックされる。ツイートが述語に合っている場合、それは新しいツリー集合に蓄積される(acc)。一方、p = falseの場合は、単に次のノードに移動します。Scalaでツリー再帰を書く標準的な方法は何ですか?

def filterAcc(p: Tweet => Boolean, acc: TweetSet): TweetSet = { 
    var result = acc 
    if(p(elem)){ 
     result = right.filterAcc(p, result incl elem) 
     result = left.filterAcc(p, result incl elem) 
     }else { 
     result = right.filterAcc(p, result) 
     result = left.filterAcc(p, result) 
     } 
    result 
    } 

次のようにpが渡された関数であるのに対し、プログラムが、呼び出されます。

filterAcc(p, new Empty) 

私の質問があり、再帰のためのScalaでの標準的な方法は何ですか?特に、結果を最高レベルの再帰に戻すこと。私の知る限りコーセラのコースから、このクラスのインタフェースを覚えて、あなたが実際にrecursion(ないregression)を意味仮定として

おかげ

+1

「再帰」を意味すると思います。あなたの実際の質問が何であるか分かりません。あなたは彼を最低レベルから戻し、次の最低レベルはそれを戻します。 –

+0

ここでは "var"の使用は間違いなく正式ではありません。私は 'if(p(elem))left.filterAcc(p、right.filterAcc(p、acc、incl elem))else ...'( 'elem'を2回追加する必要はありません) –

答えて

0

それは次のように行く必要があります:あなたが明示的に見ることができるように

def filterAcc(p: Tweet => Boolean, acc: TweetSet): TweetSet = { 
    val updatedAcc = if(p(elem)) acc.incl(elem) else acc // visit current node 
    left.filterAcc(p, right.filterAcc(p, updatedAcc)) // continue tree traversal 
} 

このコードでは主な目的は変更されたパラメータで同じ関数を呼び出すことです。 pを満たしていれば、accのパラメータを変更します。その後、rightサブツリー(right.filterAcc(p, updatedAcc))に反復し、反復の結果を取得し(次の反復に渡す)、左(left.filterAcc(p, right.filterAcc(p, acc)))サブツリーに反復する必要があります。

関連する問題