我試圖使用遞歸實現硬幣更改問題。我寫了下面的代碼,並且面臨着靜態類變量的問題。 'answer'是一個類變量,我試圖在循環中添加返回值。這在while循環內正常工作,但while循環結束後,答案被重置爲0;Java遞歸類變量值重置爲0
while (i * currentCoin <= sum) {
System.out.println("inside while; answer is " + answer);
answer = answer
+ findCombinations(
sum - i * currentCoin,
new ArrayList<Integer>(denominations.subList(1,
denominations.size())));
i++;
}
以下是我寫的所有代碼。你可以複製並運行它來檢查。
import java.util.ArrayList;
import java.util.Collections;
public class CoinChangeHashMap {
static int answer = 0;
public static void main(String[] args) {
int[] array = new int[] { 7, 3, 2 };
ArrayList<Integer> input = new ArrayList<Integer>();
getList(array, input);
findCombinations(12, input);
System.out.println(answer);
}
private static void getList(int[] array, ArrayList<Integer> input) {
for (int i : array) {
input.add(i);
}
}
public static int findCombinations(int sum, ArrayList<Integer> denominations) {
if (denominations.size() == 1) {
if (sum % denominations.get(0) == 0) {
return 1;
}
return 0;
}
int i = 0;
int currentCoin = denominations.get(0);
while (i * currentCoin <= sum) {
System.out.println("inside while; answer is " + answer);
answer = answer
+ findCombinations(
sum - i * currentCoin,
new ArrayList<Integer>(denominations.subList(1,
denominations.size())));
i++;
}
return 0;
}}
**我得到的輸出爲0,但預期輸出爲4。在調試,我得到的輸出**
inside while; answer is 0
inside while; answer is 0
inside while; answer is 1
inside while; answer is 1
inside while; answer is 2
inside while; answer is 2
inside while; answer is 0
inside while; answer is 0
inside while; answer is 0
0
任何幫助表示讚賞。
嘗試在遞歸調用 –
未調試之後打印答案值,即'System.out.println()',調試實際上需要使用步調試器逐步執行代碼一條指令,而不僅僅是把東西打印出來。 –
@JarrodRoberson,打印語句是一種久經考驗的真正的調試方法。此外,插入代碼中的print語句有助於向* us *展示問題。問題是關於爲什麼靜態變量的值被重置。 OP可能通過在調試器中運行代碼發現了自己的答案,但這並不是一個愚蠢的舉動。它甚至沒有表明缺乏研究。 –