0

再帰的に検索しようとすると、正しい番号が返されません。これを使用して、単一リンクリストで実装されたキューをトラバースし、アイテムが存在するインデックスを返すので、そのアイテムに到達するために dequeue() が必要な回数を判断できます。

public int search(E item) {
    return recSearch(item, head);
}

public int recSearch(E item, Node node){
    if (head == null){
        return -1;
    }else if (node.data.equals(item)){
        return searchCnt;
    }else{
        searchCnt++;
        return recSearch(item, node.next);
    }
}

if および else if 条件を満たさないたびにカウントする必要があるため、正しくカウントする必要があるように感じますが、適切な場所でインクリメントしていませんか? それとも、私は完全に離れていますか?助けてくれてありがとう!

4

2 に答える 2

2

を呼び出す直前にsearchCnt内部を 0に設定する必要があります。また、 かどうかをテストする必要があります。search()recSearch()node == nullhead == null

または、代わりにこれを試すこともできます:

public int search(E item) {
    return recSearch(item, head, 0);
}

public int recSearch(E item, Node node, int index){
    if (node == null){
        return -1;
    }else if (node.data.equals(item)){
        return index;
    }else{
        return recSearch(item, node.next, index + 1);
    }
}

クラス/インスタンス変数が不要になります。

nullこれはノードでのデータを許可しないことに注意してください。値をサポートするには、次のチェックの直後にnull別のブランチが必要になります。if/elsenode == null

}else if (item == null && node.data == null) {
    return index;
}
于 2013-10-29T23:44:33.460 に答える
1

searchCnt適切に更新されるように、再帰時に varを渡す必要があります。

public int search(E item) {
    return recSearch(item, head, 1);
}

public int recSearch(E item, Node node, int searchCnt){
    if (head == null){
        return -1;
    }else if (node.data.equals(item)){
        return searchCnt;
    }else{
        return recSearch(item, node.next, ++searchCnt);
    }
}

最初の呼び出しの1は、 の最初の反復でアイテムが見つかった場合、それが 1 回のrecSearch検索としてカウントされる (その場合searchは返さ1れる) と想定しています。

于 2013-10-29T23:45:10.257 に答える