4

配列が別のより大きな配列のサブセットであるかどうかを判断する何かを書くように頼まれました。より単純な問題から始めて、文字が文字の配列に存在するかどうかを判別する関数を作成することにしました。私はこのコードを思いついた:

private static boolean findSequenceRecHelper(char [] findIn, char c, int index) {
    boolean result = false;
    if(index<findIn.length) {
        if(findIn[index] == c) {
            result = true;
        }
        else {
            findSequenceRecHelper(findIn,c,index+1);
        }
    }
    return result;
}

いくつかのデバッグを行ったところ、関数がchar[]配列全体を反復処理し、配列内の要素が目的の値に等しくなると、にresult変わることがわかりましたtrue。しかし、再びそれはに変わり、false実際falseに返されますが、これは正しくありません。

ここでエラーを見つけることができません-誰かがこの問題について私を助けてくれますか?

4

4 に答える 4

5

再帰的なステップでは:

else
findSequenceRecHelper(findIn,c,index+1);

return再帰呼び出しによって返される値が必要です。それ以外の場合-何も行われておらず、再帰呼び出しは実際には冗長です。

private static boolean findSequenceRecHelper(char [] findIn, char c, int index)
{
boolean result = false;
if(index<findIn.length)
{
    if(findIn[index] == c)
        result = true;
    else
    return findSequenceRecHelper(findIn,c,index+1);
    //^ 
    //added return here
}
return result;
}
于 2012-06-06T12:19:38.783 に答える
4

メソッドを再帰的に呼び出すと、戻り値が保存されないため、文字が見つかったかどうかのインジケーターが事実上失われます。実際に実行したいのは、現在の呼び出しより上の再帰呼び出しまでの結果を返すことです。

これを試して:

private static boolean findSequenceRecHelper(char [] findIn, char c, int index)
{
    boolean result = false;
    if(index<findIn.length)
    {
        if(findIn[index] == c)
            return true;
        else
            return findSequenceRecHelper(findIn,c,index+1);
    }
}
于 2012-06-06T12:22:03.170 に答える
0

これを変える:

if(index<findIn.length)
{
    if(findIn[index] == c)
        result = true;
    else
        return findSequenceRecHelper(findIn,c,index+1);
}
于 2012-06-06T12:18:15.163 に答える
0

再帰呼び出しでは何もしていません。代わりに、結果に返すものを設定して、再帰的に返すことができるようにする必要があります。result = findSequenceRecHelper(findIn,c,index+1);あなたのif声明の中で。

于 2012-06-06T12:20:24.413 に答える