0

まず第一に、これは私を混乱させる課題であると言わなければなりません、私はすでに講師による質問の1つを修正しました:/

とにかく、ブール値、whileループ、カウンターを使用して単語をカウントするメソッドを作成しました。

ただし、これを文字列内の単語の量をカウントする再帰メソッドにどのように形作る必要があります。単語は1つまたは複数のスペースで区切られます。

countWords(" hello this is an example", 0); // returns 5

ご覧のとおり、パラメータはcountWords(String s、int i)のみであり、より困難になっています。

また、メソッド内では、これらの3つのメソッドs.charAt(0)、s.substring(1)、およびs.equals( "")のみを使用するように制限されており、これもまた頭を悩ませています:)

これは、whileループを使用して記述した再帰的でないメソッドです。

public static int countWords(String s) {
    int words = 0;
    boolean spaceBefore = true;
    boolean spaceCurrently = false;
    while(true) {
        if (s.equals(""))
            return words;

        if (s.charAt(0) == ' ')
            spaceCurrently = true;
        else
            spaceCurrently = false;

        if (spaceBefore && !spaceCurrently)
            words++;        

        spaceBefore = spaceCurrently;
        s = s.substring(1);
    }
}
4

3 に答える 3

2

これは宿題なので、コードは差し控えます。しかし、私はあなたに解決策を説明します。それからコードを再構築できるかどうかを確認してください。

この方法では、無視したいので、最初に行の最初と最後から空白を削除します。trim()そのための方法を使用してください。次に、コードで行ったように、文字列が空の文字列("")であるかどうかを確認します。そうである場合は、空の文字列に単語が含まれていないため、ゼロを返します。そうでない場合は、無限ループ(while (true))で次の条件を確認します。

  • 現在のインデックスを保持する変数を作成します。この変数はループに対してローカルではありませんが、メソッドに対してローカルです。無限ループの反復ごとに、現在の文字(charAt()メソッドを使用)がスペースではないかどうか、およびインデックスが文字列の長さよりも小さいかどうかを確認してください。この条件が真の場合、インデックス変数をインクリメントします。
  • そうでない場合は、インデックス変数が文字列の長さと等しいかどうかを確認します。はいの場合、文字列の最後の単語に到達したことを意味するため、1を返します。
  • そうでない場合は、1の合計と単語をカウントするメソッドを返し、インデックスの現在の値から部分文字列を再帰的に呼び出します。

これはあなたに価値を与えるはずです。それでもできない場合は、お知らせください。ソースをお知らせします。

編集Stringのtrimメソッドを使用できない場合は、次のように自分で作成できます。私はそれがあなたの要件のいずれにも違反していないと信じています:

private String trim(String str) {
    int beginIndex = 0;
    int endIndex = str.length() - 1;

    while (true) {
        if (str.charAt(beginIndex) == ' ') {
            beginIndex++;
        } else if (str.charAt(endIndex) == ' ') {
            endIndex--;
        } else {
            break;
        }
    }

    return str.substring(beginIndex, endIndex);
}

編集2どちらも使用できない場合はlength()、上記のコード行int endIndex = str.length() - 1;' toint endIndex = getLength(str)-1; `を変更し、次のコードを使用して長さを計算します。

private int getLength(String str) {
    int length = 0;

    while (true) {
        try {
            str.charAt(length++);
        } catch (StringIndexOutOfBoundsException e) {
            break;
        }
    }
    return --length;
}

編集3質問はそのようなPITAであるため、言葉で説明するのは難しいでしょう。コードは次のとおりです。

private int countWords(String searchString) {
    int index = 0;
    boolean beginning = true;       // to check if it's the beginning of the line

    if (searchString.equals("")) {
        return 0;
    } else {
        while (true) {
            try {
                if (searchString.charAt(index) != ' ') {
                    beginning = false;
                    index++;
                } else {
                    if (!beginning) {
                        return 1 + countWords(searchString.substring(++index));
                    } else {
                        return countWords(searchString.substring(++index));
                    }
                }
            } catch (StringIndexOutOfBoundsException e) {
                if (!beginning) {
                    return 1;
                } else {
                    return 0;
                }
            }
        }
    }
}

これは、使用が許可されている方法だけで目的を達成するのに役立ちます。

于 2013-02-11T12:42:47.470 に答える
0

これはあなたの割り当てであるため、コードを直接投稿することはしませんが、ここにいくつかの指示があります。

文字列内の単語数は、現在の単語+文字列の残りの単語数です。一度に処理できる文字は1つに制限されているため、次のように考えることができます。

  • あなたが一言であるかどうかを教えてくれるパラメータを持っている
  • s.charAt(0)がスペースであり、単語内にいる場合は、カウンターを増やし、inWordをfalseに設定します。
  • s.charAt(0)が文字であり、単語に含まれていない場合は、inWordをtrueに設定します
  • 更新されたcounterとs.subString(1)および更新されたinWordで再帰

そして、あなたはすべてを0、s、falseで開始します

変数をループの外側からメソッドパラメーターに移動するときに、ループを再帰に変換することを想像してみてください。

これがあまり混乱していなかったと思います。

于 2013-02-11T12:20:30.990 に答える
0

これが宿題であることを考えると、私はあなたにすぐに答えを与えることはしません。

メソッドがそれ自体を呼び出すメカニズムの場合の再帰。明らかに、メソッドがこれを無期限に実行すると、最終的にスタックオーバーフロー例外が発生するため、メソッドがそれ自体の呼び出しを停止する、ある種の終了条件が必要になります。

ここに例があります-2つの数を取り、それらを乗算する乗算メソッドを書きたいと思ったが、あなたが自由に使えるのは加算と減算だけだと想像してください。

public int multiply(int value1, int value2) 
{
  if (value1 > 1) 
  {
    int remaining = value1 - 1;
    return value2 + multiply(remaining, value2);
  }
  else 
  {
    return value2;
  }
}

ここで、メソッドは自分自身に自分自身を追加するまで自分自身を呼び出しvalue2value1その時点でスタックを返します。

単語数を数えるのと同じようなことをすることができます-文字列にスペースがなくなるまで、文字列の最初のスペースから最後まで取ったサブ文字列を渡すメソッドを呼び出し続け、その時点でスタックを返します。

于 2013-02-11T12:20:42.987 に答える