1

これは宿題用です。宿題は再帰ではなく、ツリー構造です。割り当てはほぼ完了しましたが、ツリーを上に移動するための再帰的な方法が壊れています。ツリー構造は、以下のクラスによって与えられます。

package lab12;

import java.io.Serializable;

public class Dog implements Serializable{

    public Dog[] children;
    public String name;

    public Dog(String name)
    {
        this.name = name;
    }

    @Override
    public String toString()
    {
        return name;
    }

} 

その理由は return null であると確信しています。私のforループと組み合わせたステートメント。for ループは、子を含まないノードを反復処理し、結果として null を返します。これでメソッドが終了し、プログラムに null が返され、null ポインター例外が発生します。

return null ステートメントを削除できないか、for ループを使用して 100% 戻りますが、コンパイルされません。

public Dog findParent(Dog root, String name)
{
    String top = "Spot";
    if(top.equals(name))
    {
        System.out.println("No further records");
        System.out.println("Goodbye.");
        System.exit(0);
    }
    for(int i = 0; root.children != null && i < root.children.length; i++)
    {
        if(root.children[i].name.equals(name))
        {
            return root;
        }
        else
        {
            return findParent(root.children[i], name);
        }
    }
    return null; //Compiler still requires a return here.
}

これは、非 void 再帰メソッドで for ループを使用する場合の一般的な問題に違いないと思います。コンパイラを満足させながら、余分な return null ステートメントを持たないようにする方法はありますか?

4

2 に答える 2

4

コードが機能してはいけません。if句とelse句の両方が返されるためです。これにより、ループはインデックス0のみを実行します。次のようにコードを変更する必要があります。

public Dog findParent(Dog root, String name)
{
    String top = "Spot";
    if(top.equals(name))
    {
        System.out.println("No further records");
        System.out.println("Goodbye.");
        System.exit(0);
    }
    for(int i = 0; root.children != null && i < root.children.length; i++)
    {
        if(root.children[i].name.equals(name))
        {
            return root;
        }
        else
        {
            Dog parent = findParent(root.children[i], name);
            if (parent != null) 
                 return parent;
        }
    }
    return null;
}

これで、最後の「returnnull」が必要であることがわかります。

ほとんどの場合、コンパイラは賢いです。警告が表示される場合は、警告を回避するためにコンパイラをごまかすのではなく、コードのエラーを検討する必要があります。

于 2012-12-09T09:49:19.343 に答える
2

この問題を完全に理解していなければ、「returnnull」ステートメントが実行されない理由はわかりません。おそらく、他のステートメントは次のようになります。

return findParent(root.children[i], name);

この戻り値により、「親」が見つかるとその値が返されます。

于 2012-12-09T09:46:26.397 に答える