2012-02-08 12 views
0

ソートされたリストに挿入するオブジェクトのインデックスを再帰的に返す検索メソッドを実装しようとしています。新しいアイテムがソートされたリストの中に入る場所を再帰的に検索しますか?

ここは私の試みです。

//listSize is the number of elements inside the sorted list 
//sortedList is the actual structure holding the values 
// Note: the parameter Value is comparable. 
public int search(T value,int index){ 

    if(listSize == 0){ 
     return 0; 
    } 
    if(index > listSize){ 
     return listSize+1; //add at the end 
    } 
    if(value.compareTo(sortedList[index]) > 0 && value.compareTo(sortedList[index+1]) < 0){ 
     //value is less 
     return index+1; 
    }else if(value.compareTo(sortedList[index]) == 0){ 
     //both are same 
     return index+1; 
    } 
    return search(value,index++); 
} 

何らかの理由でStackOverflowErrorが表示されているようです。

+0

'++ index'を使うべきですか? – Nishant

+0

templatetypedefで正しく識別されたエラーを修正したとしても、リスト内の要素ごとにスタックフレームを使用しているという問題がありますので、リストが数千の要素。リストがどのようにソートされているかを見ると、代わりにバイナリ検索を実装したいと思うでしょう。 – Dolda2000

答えて

1

あなたがindex++の効果がある

return search(value,index++); 

を言っている「インクリメント指数は、その後、indexを持っているために使用する値を手の甲。」これは、再帰呼び出しに渡されたindexの値が元の呼び出しと同じになることを意味します。私は、あなたがより正確にsearchindex + 1の値を渡し

return search(value, index + 1); 

を読み取るために、これを変更したいと思います。

ここに他のエラーがあるかもしれませんが、これは確かに問題を引き起こすでしょう。これを変更して何が起こるかを見てみてください。

希望すると便利です。

+0

'++ index'は同じことをする必要があります。 – Nishant

+0

私はその間違いを犯したと信じていません! –

+0

@ Nishant-それは本当ですが、 'index'はスコープ外に出るローカル変数なので、ここでは' ++ index'を使う理由は何もありません。副作用は誤解を招き、コードを少し微調整して( 'index ++'に戻って)、それが壊れます。 – templatetypedef

0

の前に、のインデックスを挿入する必要がありますか?あなたの方法は、再帰的に際限なく自分自身を呼び出します場合、値< SortedListの[インデックス] ...

EDIT:あなたは「インデックス++」のバグを修正した場合

、あなたは今なっている値が不正な動作が表示されますリストの先頭に挿入される、代わりに追加されます。

関連する問題