1

だから私は再帰を学ぼうとしています(私はこの場合再帰は必要ないことを知っています)

私はすでにこの方法を書いています。

public static int method(int number) {
    if(number == 0) {
        return 1;
    }
    else {
        return (int)Math.pow(2,number) + method(number-1);
    }
}

これは、2 のべき乗を 0 から数値まで合計するのに完全に機能しますが、Math.pow()別の再帰的なメソッド呼び出しに置き換える方法があるかどうか疑問に思っていました

4

7 に答える 7

5

これを再帰べき乗関数として使用できます。

public static int powerOf2(int number) {
    if (number == 0) {
        return 1;
    } else {
        return 2 * powerOf2(number - 1);
    }
}

または、1 行の本文として:

return number > 0 ? 2 * powerOf2(number - 1) : 1;
于 2013-01-31T03:49:09.100 に答える
2

おそらく、Math.pow(2,n) を再帰的に計算するには、別の再帰的メソッドを定義する必要があります。ただし、Math.pow(2,n) をすばやく計算するには、2 のビット シフト操作を行うことをお勧めします。たとえば、 2 << (n-1) をシフトすると、ここで hob が実行されます。

于 2013-01-31T03:48:20.253 に答える
1

より一般的な解決策:

public static int pow (int base, int ex) {
    if (ex == 0) {
        return 1;
    } else if (ex == 1) {
        return base;
    } else if(ex > 1) {
        return (pow(base, ex - 1) * base);
    } else {
        return pow(base, ex + 1) / base;
    }
}

これは、渡された値が整数である可能性のあるすべてのケースを処理します。

于 2013-01-31T04:27:31.893 に答える
1

厳密な質問からは少し遠いかもしれませんが、あなたの問題は、連続する用語間の一定の比率を持つシリーズである幾何級数の合計を計算することです。

最初の要素は 1 に等しく (2 pow 0 として)、比率は 2 に等しくなります。したがって、再帰を使用する代わりに、よく知られている一般的な等式で使用できます。

public long computGemetricSeries(int n) {
  long firstElem = 1;
  long ratio = 2;

  return (firstElem * (1 - Math.pow(ration,n)) / (1 - ratio));
}

または一般的な用語の場合 (べき乗 o 2 だけでなく):

public long computGeometricSeries(int n, double ration, double firstElem) {
   return (firstElem * (1 - Math.pow(ration,n)) / (1 - ration));
}

ここで再帰が本当に必要な場合Math.pow(ration,n)は、他の回答で提案された再帰関数に変更できます。

あなたの質問の解決策としてはあまり役に立たないと思いますが、知っておくと良い答えになるでしょう。

于 2013-01-31T20:39:27.807 に答える
1

再帰を学びたい場合は、ファボナッチシリーズのよく知られた例を取り上げてください。

public int getNthFibonacci( int n )
    {
        if ( n == 1 || n == 2 ) 
            return 1;

      else
        return getNthFibonacci( n-1 ) + getNthFibonacci( n-2 );
    }

public static void main(String[] args){

        Recursion myRecursor = new Recursion();
        System.out.println( myRecursor.getNthFibonacci(5) );

    }

しかし、あなたの場合、 for ループでも簡単に実行できます。

public static void main(String[] args) {

       int sum = 0;     
        for (int number = 20; number>0; number--)
        {
            sum += Math.pow(2,number);
        }

        System.out.println(sum);

}
于 2013-01-31T03:55:48.457 に答える