3

次のようなスーパークラスとサブクラスがあります。

class Tree{
 ..
 public void add(..){
 //makes a call to protected function add(..) 
 }//for client to use.
 protected TreeNode add(..){}//recursive function which calls itslef
}

class Stree extends Tree{
 //overrides the recursive add function from class Tree
 protected TreeNode add(..){
   ..
   super.add();//calls the non-recursive add function in superclass.
 }
}

ここでの問題はsuper.add()、サブクラスの新しい add 関数から呼び出すと、 Tree.add(). 内部Tree.add()。への呼び出しがありadd()、スーパーの代わりにサブクラスで再帰的な add 関数を呼び出します。つまりStree.add()、代わりにTree.add()、無限ループが発生します。問題がどこにあるかわかりますか?

これは宿題なので、再帰関数の名前を変更することはできません。既存のコードを書き直すことなく、再帰的な add 関数に機能を追加することが明示的に要求されています。これは基本的に、元のadd()関数を呼び出す必要があることを意味します。

編集: Tree.add() //再帰のコード。私が求める機能を得るためにこのコードを変更することはできないことに注意してください。

protected StreeNode add(StreeNode node, String value) {
        if (node == null) {
            node = new StreeNode(value);
            numElements++;
        } else if (node.data.compareTo(value) == 0) {
            // do nothing, String was already in Set
        } else if (node.data.compareTo(value) > 0) {
            node.left = add(node.left, value);      // x = change(x)
        } else {
            node.right = add(node.right, value);    // x = change(x)
        }

        return node;
    }

編集:これが期待される動作であることがわかったので、次のことを達成するにはどうすればよいですか:

  1. 元の再帰を使用して値を追加しますadd()
  2. 追加機能を実装する
4

3 に答える 3

2

パラメーターを確認せずvoid add(...)に、ツリーに何かを追加するメソッドであると想定しますが、保護された再帰メソッドは、追加するノードを探してから追加を実行します。

さらに、パブリックな非再帰メソッドはツリーのルートを再帰メソッドに開始パラメーターとして渡し、再帰メソッドは葉に到達するまで左または右の子を渡すと仮定します。したがって、非再帰メソッドを呼び出すと、ルートから何度も開始される可能性があります。

したがって、再帰的および継承されたメソッドは、非再帰的なバージョンを呼び出すべきではなく、それ自体を再度呼び出す必要があると言えます。

于 2012-04-27T20:11:17.437 に答える
1

Ok。これはランダムで、あまり意味がないかもしれません。

あなたのコメントでは、 Tree.add が再帰的であり、 STree.add が再帰的であると述べています。

再帰を行わない保護されたメソッド Tree.addCommon(..) を作成し、実行する必要があることだけを行います。

Tree.add(..) は addCommon(..) を呼び出し、次に this.add(..) を呼び出して再帰します。

STree.add(..) は余分なものを実行し、共通のものに対して super.addCommon(..) を呼び出し、次に this.add(..) を呼び出して再帰します。

知っている。疑似コードを書くべきでした。怠惰。

于 2012-04-27T20:04:37.347 に答える
0

クラスを変更できない場合はそうではないかもしれませんが、再帰を担当するaddHelper(...)という別のメソッドを作成してから、このヘルパーをadd(内で呼び出すのが最善の解決策だと思います。 ..) 方法。

于 2013-03-09T19:19:15.893 に答える