0

これはJavaのメソッドであり、(k == 0の場合)int[]arrにk-combinationint[]整数の1つがあります。変数では、iloczynはこの組み合わせの要素の計算された積です。tmpでは、そのようなすべての製品の合計が計算されます。残念ながら、System.out.println(tmp)は、関数が終了するとtmpが0になることを示しています。次の計算でこの変数が必要になるため、これは非常に悲しいことです。私は何をすべきですか?

int tmp = 0;
public void kcomb(int[] items, int n, int k, int[] arr) 
{
    int iloczyn = 1;


    if (k == 0) {
        for(int i = 0; i< arr.length; i++){
            iloczyn*=arr[i];
        }
        tmp +=iloczyn;


    } else {
        for (int i = n; i <= items.length - k; i++) {
            arr[arr.length - k] = items[i];
            kcomb(items, i + 1, k - 1, arr);
        }
    }
    System.out.println(tmp);
}
4

4 に答える 4

3

再帰的な方法は注意が必要です。メソッドの戻り値をうまく処理していないため、やけどを負っています。実際、1つはまったくありません。

まず、@ olicharlesworthが推奨するように実行し、コードをデバッグします。それは啓発されるでしょう。

次に、これを修正するために、ルーチンには基本的に決して会わない2つのピース(k == 0ピースともう1つ)があると考えてください。これらの各セクションは、tmp値を初期化し、そのセクションに適切なtmp値を計算して、呼び出し元に返す必要があります。

その場合、問題のあるインスタンスのtmp変数は問題になりません。

于 2012-05-15T22:09:52.537 に答える
2

このメソッドは常に 0 を出力するとは限りません。テストしたところ、入力に対して{1, 3, 5, 7}, 3, 1, {4, 3, 2, 1}は 168 (2 回) が出力されました。もちろん、これらの入力がまったく意味があるかどうかはわかりません。

ロジックをよく考えて、コードが本来あるべきと考えていることを実際に実行しているかどうかを確認する必要があります。@TonyEnnisは、副作用ではなく戻り値を使用すると、これがはるかに良くなるということは正しいです(理解するためと、コーディングの実践の観点から)。

于 2012-05-15T22:18:39.310 に答える
1

arr[] の値はゼロですか? それが true の場合、このブロックは次のようになります。

for(int i = 0; i< arr.length; i++){
        iloczyn*=arr[i];
}

...常にゼロを生成します。最初の値が 0 の場合、iloczyn * 0 = 0 となり、その後の反復もすべて 0 になります。配列内のいずれかの値がゼロの場合も同じことが起こります...それらは iloczyn を毎回強制的にゼロに設定します。

念のため、コードをステップ実行して arr[] の値を再確認します。

于 2012-05-15T22:16:29.987 に答える
0

何かが欠けていない限り、k==0 の場合にのみ tmp を設定します。k は変更されないため、メソッドが呼び出されるときは非ゼロでなければなりません。

于 2012-05-15T22:06:19.420 に答える