2

次の再帰メソッドを作成する必要があります。

public static int countA(String s)

それでも、カウンターと位置変数を宣言せずにこれを行うことは不可能だと思います。そのようです:

public static int countA(String s, int position) {

        int count = 0;

        if( s.charAt(position) == 'A' )
            count++;

        if( position + 1 < s.length() ) {
            count += countA(s, position + 1);
        }

        return count;
    }

私の方法がリストされているものと同じになるように、どうすれば答えを単純化できますか?

編集: はい、文字列内のすべての A を数えたいと思います。

4

6 に答える 6

1

再帰には 2 つの形式があります。

  • Tail Recursion : 戻り値は、現在のサブルーチンの値と次の呼び出しの戻り値の組み合わせとして計算されます。例、

    int factorial(int a) {
        if(a==0)
            return 1;
        else
            return a * factorial( a-1 );
    }
    
  • アキュムレータ ベースの再帰 : 追加のパラメーターを追加して結果を累積し、累積値を返します。

    int factorial(int a, int fact) {
        if(a==0)
            return fact;
        else
            return factorial(a-1, a*fact);
    }
    

明らかに、ここにあるのはアキュムレータ ベースですが、Tail 再帰に改善できます。

末尾再帰はより読みやすいと見なされますが、 StackOverflow が発生する可能性があります。(しゃれは意図されていません)。これは、サブルーチンを再度呼び出す前に、現在の値をスタックにプッシュする必要があるためです。また、このような呼び出しを多数行うと、このスタックが限界を超える可能性があります。

一部のコンパイラは、この問題を回避するために、末尾再帰をアキュムレータ ベースに最適化します。

于 2013-11-06T07:22:05.137 に答える
0

理想的には、最初に終了条件があり、通常はインデント/ネストを減らすことでコードを簡素化し、「何もしない」アクションを実行します (通常、絶対に必要な反復よりも 1 回多く反復する必要があります)。

ローカル変数も必要ありません!

public static int countA(String s, int position) {
    if (position == s.length())
        return 0;
    return (s.charAt(position) == 'A' ? 1 : 0) + countA(s, position + 1);
}
于 2013-11-06T07:09:14.950 に答える
0

positionメソッドから変数を移動して作成しstaticます(あなたcountA()も であるためstatic)。

static int position = 0;
public static int countA(String s) {
    int count = 0;
    if( s.charAt(position) == 'A' )
        count++;
    if( position + 1 < s.length() ) {
        position++;
        count += countA(s);
    }
    return count;
}
于 2013-11-06T07:08:03.713 に答える