1. ホーム
  2. java

[解決済み] 再帰的ヘルパーメソッド

2022-02-19 02:01:18

質問

この演習の正しい解答が見つからないので、ここに課題を示します。


(指定された文字が配列に出現する)再帰的なメソッドを書いてください。 配列中の指定された文字の出現回数を求めよ。 必要なのは 以下の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 モディファイアはタスクの説明で要求されましたが、、、この欠陥をインストラクターに知らせると、ボーナスポイントがもらえるかもしれません;-)