コードの先頭に停止条件を設定するだけです。 iStart
が先頭に0とiEnd
である場合、これは動作しますが、配列の長さである - あなたはほんの少しのコードを変更する必要がiEnd
ための入力として、配列の長さを使用する場合は1
private boolean equalsHelper(int[] first, int[] second, int iStart, int iEnd) {
if (iStart == iEnd) { // you need to check this first
return first[iEnd] == second[iEnd];
}
if (first[iStart] == second[iStart]) {
if (equalsHelper(first, second, (iStart + 1), iEnd)) {
return true;
}
}
return false;
}
private boolean equalsHelper2(int[] first, int[] second, int iStart, int iEnd) {
if (iStart == iEnd) {
return true;
}
if (first[iStart] == second[iStart]) {
if (equalsHelper2(first, second, (iStart + 1), iEnd)) {
return true;
}
}
return false;
}
パフォーマンスは数回述べられているので、私はそれについていくつか言います。 スタックには、ローカル変数と関数呼び出しに関する情報が含まれています。だから、各再帰呼び出しはスタックにこれらの情報を保存します。スタックは限られたスペースしか持たないので、膨大な入力に対してスタックオーバーフローが発生します。また、ループと比較してアセンブラコマンドが多くなるため、実行速度が遅くなります。
これは、テール再帰関数を使用することで回避できます。 テール再帰呼び出しとは、再帰呼び出しが、メソッドで最後に実行された文でなければならないことを意味します。コンパイラはこれをループに変換します。これは速く、スタックのスペースを少なくします。
あなたのequalsメソッドの末尾再帰バージョンは、次のようになります。
private boolean equalsHelper2(int[] first, int[] second, int iStart, int iEnd)
{
if (iStart == iEnd)
{
return true;
}else{
if(first[iStart] != second[iStart])
{
return false;
} else
{
return equalsHelper2(first, second, iStart + 1, iEnd);
}
}
}
あなたはいくつかの点で、アレイの 'length'をチェックする必要があります。 –
この宿題です(['Arrays.equals()'](https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#equals%28int)を使用することはできません[]、%20int []%29)? –
これは再帰的にする必要はありませんが、あなたはそれをオーバーコンプリートしています。配列が異なっていれば、それらは等しくはありません - もちろんですが、そうであればforループを使い、各インデックスをループして同様のインデックスを比較します。 – pczeus