2017-05-18 9 views
0

私はcoin change problemのすべての解決策を見つけることを試みています。コインの変更 - すべてのソリューションの再帰 - Java

例:私はコイン1と2を用意して、私は6

適切なソリューション変更したい: [1,1,1,1,1,1]、[2,1,1を、1,1,0]、[2,2,1,1,0,0]、...

私のコード: [1,1,1,1,1,1]、[1 、1,1,1,0,0]、[1,1,0,0,0,0]、...

最後の行でもパラメータ "coinsSoFar"が削除されます。私がそれをデバッグすると[0,0,0,0,0,0]にcoinsSoFarを[0,0,0,0,0,0]に設定します。これは[2,0,0,0、 0,0]。

非常に感謝します。 (クリアアレイ:0に設定されているすべての数字; addToArray:数で最初の0を置き換え)

public static void makeChange(int amount, int startCoinIndex, int[] coinsSoFar) { 

    if (amount == 0) { 
     System.out.println(Arrays.toString(coinsSoFar)); 
    } 

    if (startCoinIndex == coinSet.length || amount < 0) {return;} 

    for (int i = 0; i * coinSet[startCoinIndex] <= amount; i++) { 

     int[] temp = coinsSoFar; 

     for (int j = 0; j < i; j++) { 
      addToArray(temp, coinSet[startCoinIndex]); 
     } 

     makeChange(amount - i * coinSet[startCoinIndex], startCoinIndex+1, temp); 
     clearArray(temp); // this line also clears coinsSoFar. Why? 

    } 
} 
+0

であるべきです。 'int [] temp = coinsSoFar;'を呼び出すと、配列のコピーではなく、同じ配列への参照を作成します。また、 '|| amount <= 0' – StanislavL

+0

ありがとう、これらの2つの変更で機能は動作します。 –

答えて

0

あなたはclearArray(temp, 0)との明確な元の配列 - 参照渡し。

int[] temp = coinsSoFar;を呼び出すと、配列のコピーではなく、同じ配列への参照を作成します。参照渡し -

はまた、 `クリアアレイ(TEMP、0) 'を有する透明元の配列は、|| amount <= 0

+0

ありがとうございました! –

+0

その後、正しい答えを受け入れます。 – StanislavL

1

あなたがcoinsSoFarと同じ配列を参照するために一時を設定している

int[] temp = coinsSoFar; 

を行います。だから、tempに行ったことは、現在coinsSoFarに影響します。

あなたがcoinsSoFarコピーを参照しtempのためのものならば、ここで何をするかです:

int[] temp = Arrays.copyOf(coinsSoFar, coinsSoFar.length); 
// OR, if you prefer 
int[] temp = new int[coinsSoFar.length]; 
System.arraycopy(coinsSoFar, 0, temp, 0, coinsSoFar.length); 
+0

ありがとう、私は参考文献をコピーと考えました。 –

関連する問題