1

以下の引用符は私の実際の割り当てであり、その下は私の現在のコードです。誰かが私を正しい方向に向けることができますか?

最初の n 個の偶数の積を返す、multiplyEvens という再帰的メソッドを作成します。たとえば、multiplyEvens(1) は 2 を返し、multiplyEvens(4) は 384 を返します (2 * 4 * 6 * 8 = 384 であるため)。1 未満の値が渡された場合、IllegalArgumentException をスローします。

  private static int multiplyEvens(int n)
  {  
      if(n%2 == 0)
      {           
          System.out.println(n*n);
          return multiplyEvens(n*n);
                      // I'm lost
      }
      System.out.println();
      return n; 
  }
4

6 に答える 6

5

n*n ではなく n-1 で再帰してみて、 の値が にどのようにmultiplyEvens(n)関係するかを理解できるかどうかを確認してくださいmultiplyEvens(n-1)。多分それはあなたに正しい方向へのスタートを与えるでしょう.

于 2012-04-19T00:42:25.687 に答える
5

紙の上でそれを見てください。

n = 1 から開始

1%2 = 1 so you don't do into your loop, and return value = 1 (wrong)

n = 2 を試してください

2%2 = 0, so you go into your loop and call multiplyEvens(2*2)
4%2 = 0, so you go into your loop and call multiplyEvens(4*4)
16%2 = 0 ...

ここまでで、アプローチに関する少なくとも 1 つの問題の手がかりを得始めているはずです...

于 2012-04-19T00:43:50.410 に答える
3

再帰的に実行できることは、反復的に実行できます。次のように考えてください: for ループを書いているとき、作業している値のパリティ (偶数/奇数) 値を決定する前に、n までの追加の値が必要です。

これは宿題なので、大まかなストロークは次のとおりです。

  • 再帰条件は、1 つではなく 2 つのパラメーターを取る場合があります。
  • ある値になるまで値を乗算する必要がありますi <=n

あなたはほとんどそこにいます。

于 2012-04-19T00:42:50.570 に答える
1

逆にやればいい。つまり、再帰呼び出しごとに、(2 * n) * n を減らした再帰呼び出しを返します。基本的なケースは n = 1 の場合で、関数は別の再帰呼び出しで乗算せずに単純に 2 を返します (n < 1 の場合にスローする必要がある IllegalArgumentException を満たすため)。

于 2012-04-19T00:44:27.020 に答える
0


n 個の偶数を乗算することは、 2^n * nと同じです!
あなたがしなければならないのは、グーグルの階乗再帰Javaです

于 2012-04-19T01:20:19.253 に答える
0

どうぞ:

public static void main(String[] args) {
    System.out.println(multiplyEvens(4));
}

private static int multiplyEvens(int n) {
    if(n < 1) throw new IllegalArgumentException("Value less than 1 not supported");
    else if(n == 1) return 2;
    else return multiplyEvens(n-1) * (n*2);
}

ここに再帰アルゴリズムの基本があります。n-1 に対して計算された結果があると仮定する必要があります。次に、n で調整された n-1 の結果を返します。(つまり、n 番目の偶数 n*2 を掛けます)。再帰的なメソッド呼び出しが残りの処理を行い、n-2 の値を計算済みであると想定します。結果が 1 になる n==0 になるまで...

于 2012-04-19T02:02:24.970 に答える