[解決済み] 再帰的ヘルパーメソッド
質問
この演習の正しい解答が見つからないので、ここに課題を示します。
(指定された文字が配列に出現する)再帰的なメソッドを書いてください。 配列中の指定された文字の出現回数を求めよ。 必要なのは 以下の2つのメソッドを定義します。 2つ目は再帰的ヘルパーメソッドです。
public static int count(char[] chars, char ch)
public static int count(char[] chars, char ch, int high)
1行の文字のリストを入力するようユーザに促すテストプログラムを作成しなさい。 と文字を入力し、その文字がリストに何回出現したかを表示します。
1) 別のパラメータ (int index) を追加すれば解決しますが、別のパラメータを追加したり、for ループを使用せずに解決するにはどうすればよいですか?
2)なぜヘルパーメソッドがあるのですか?再帰のヘルパーメソッドの目的がよくわかりません。
以下は私の解答です。
package occurencesinarray;
import java.util.Scanner;
public class Start {
public static void main(String[] args){
System.out.println("Enter few characters: ");
Scanner scan = new Scanner(System.in);
String s = scan.nextLine();
char[] chars = new char[s.length()];
for(int i = 0; i < s.length(); i++){
chars[i] = s.charAt(i);
}
System.out.println("Enter desired character: ");
char ch = scan.nextLine().charAt(0);
System.out.println(count(chars, ch));
}
public static int count(char[] chars, char ch){
return count(chars, ch, 0, 0);
}
public static int count(char[] chars, char ch, int high, int index){
if(index == chars.length){
return high;
}
if(chars[index] == ch){
return count(chars, ch, high + 1, index + 1);
} else{
return count(chars, ch, high, index + 1);
}
}
}
解決方法は?
AllenKll がすでに指摘しているように
high
の値は、おそらくあなたが意図した役割を果たすはずです。
index
. の出現回数を数えていたんですね。
high
という変数があるが、このカウントは再帰の中で "hidden"することができる。
一般に、再帰のためのこれらのメソッドの目的は、まさにそれです。通常、(少なくとも)1つの追加パラメータを持ち、再帰がどこまで進んでいるか、あるいはまだどこまで進んでいるかを記述することができます。後者の例として。また
high
をカウントダウンとして使用します。
public static int count(char[] chars, char ch)
{
return count(chars, ch, chars.length - 1);
}
public static int count(char[] chars, char ch, int high)
{
if (high == -1)
{
return 0;
}
if (chars[high] == ch)
{
return 1 + count(chars, ch, high - 1);
}
return count(chars, ch, high - 1);
}
もちろん、ヘルパーメソッドだけを提供することもできる。を呼び出す代わりに
count(chars, ch);
を呼び出すように指示することができます。
count(chars, ch, 0);
しかし、ここで問題なのは、このメソッドが誤って使用される可能性があることです。ユーザーが間違った値を最後のパラメーターとして渡した場合、このメソッドは動作しません。
注:このヘルパーメソッドというのは、ヘルパーメソッドが以下のような場合にのみ意味を持ちます。
プライベート
. それが
public
の場合、ユーザーはまだ間違ったメソッドを呼び出す可能性があります。なるほど
public
モディファイアはタスクの説明で要求されましたが、、、この欠陥をインストラクターに知らせると、ボーナスポイントがもらえるかもしれません;-)
関連
-
[解決済み】Javaパッケージが存在しないエラー
-
[解決済み】Hibernateエラー:同じ識別子値を持つ別のオブジェクトがすでにセッションに関連付けられました。
-
[解決済み】imageio.IIOException: 入力ファイルが読み込めない
-
[解決済み】popBackStack()とreplace()の操作はどう違うのですか?
-
[解決済み】不正な反射的アクセスとは?
-
[解決済み】Javaクラスの "型に解決できない"
-
[解決済み】Mockitoでモックからチェックされた例外を投げる
-
[解決済み】メソッド本体がない、またはJavaで抽象的な宣言をする
-
[解決済み】Javaの未処理例外について
-
[解決済み】フォルダに書き込もうとすると「java.nio.file.AccessDeniedException」が発生する件
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】代入の左手は必ず変数 CharAt
-
[解決済み】指定された子にはすでに親がいます。先に子の親に対してremoveView()を呼び出す必要がある(Android)
-
[解決済み] 二項演算子「&」のオペランド型がおかしい java
-
[解決済み】Eclipseがエラーメッセージ "Java was started but returned exit code = 1" を返す
-
[解決済み】デフォルトのキーストアファイルが存在しない?
-
[解決済み】Javaを使用するSelenium - ドライバの実行ファイルのパスは、webdriver.gecko.driverシステムプロパティで設定する必要があります。
-
[解決済み】Javaで文字列をコピーするにはどうしたらいいですか?
-
[解決済み】Eclipseで「JUnitテストが見つかりませんでした。
-
[解決済み] java.sql.SQLException を取得しました。ResultSet が終了した後の操作は許可されません。
-
[解決済み] テスト