2

特定の文字列に文字「e」が出現する回数を再帰メソッドでカウントしようとしています。私のテスト文字列はCount my e's please!. これまでのコードは次のとおりです。

public static int showE(String s, int count, int index)
{
        if (index == -1) return count;
        String e = "e";
        int i = s.indexOf(e, index);
        if (i != -1) count ++;
        return showE(s, count, i);
}

コードをデバッグすると、int i呼び出しごとに増加するのではなく、9 のままになります。

コードの最後の行が入力として使用されたため、テスト文字列の呼び出しごとにメソッドのシグネチャが 9、15、および 18 にint i設定されると考えました。int index文字 e が検出されなくなったら int i、署名に -1 を送信int countし、メイン メソッドに戻すと考えました。ただし、デバッグはint i、StackOverflowError につながる呼び出しごとに 9 に設定されることを示しました。どうすればこれを修正できますか?

編集: これは、Stephen C への応答のコードです。フォーマットについて申し訳ありません:

public static int showE(int count, int index)
{
        String e = "e";
        index = s.indexOf(e, 0)
        for(int i = index; i = < s.length() - 1; i++)
        {
            if (index == e) count++;
        }
        return count;
}
4

2 に答える 2

7

String.indexOf指定したインデックスで検索を開始します。インデックス 9 から検索を開始し、そこに 'e' が見つかるので、9 を返します。

で indexOf を開始してみてくださいindex + 1

于 2013-03-10T00:14:22.673 に答える
0

2 つのポイント:

  • メソッドで 2 つの引数のみを必要とする、この問題に対するより洗練された再帰的な解決策がありますshowEヒント:再帰呼び出しの結果に何かを追加することを考えてみてください ...

  • Java の問題に対する再帰的ソリューションには固有の問題があります。Java スタックは常に有限であり、Java は末尾呼び出しの最適化を実装していません。これら 2 つを組み合わせると、非常に深い再帰を必要とする問題がスタック オーバーフローにつながることは避けられません。

    この場合、これは、十分に長い文字列で E を数えようとすると、例外が発生することを意味します...たとえ再帰が正しいとしても。

于 2013-03-10T00:29:13.247 に答える