我正在开发一个函数,该函数使用递归调用将给定的输入分解为面额。
在每个步骤中,它都会分为两个变体:
除了在剩余== 0时打印出列表中捕获的面额组合之外,我还打算捕获该列表的值并从函数中返回它。
代码如下:
static final int[] DENOMINATIONS = {9,5,3};
private static void change(int remaining, List<Integer> coins, int pos)
if (remaining == 0) {
// This correctly prints the desired output.
// I want to return that exact value from the function.
System.out.println(coins);
} else {
if (remaining >= DENOMINATIONS[pos]) {
coins.add(DENOMINATIONS[pos]);
another.addAll(coins);
change(remaining - DENOMINATIONS[pos], coins, pos);
coins.remove(coins.size() - 1);
}
if (pos + 1 < DENOMINATIONS.length) {
change(remaining, coins, pos + 1);
}
}
}
public static List<Integer> denominations(int amount) {
List<Integer> result = new ArrayList<Integer>();
List<Integer> another = new ArrayList<Integer>();
change(amount, result, another ,0);
System.out.println(another.size());
return another;
}
public static void main(String[] args) {
List<Integer> list = denominations(13);
System.out.println(list);
}
输出:[5、5、3]
答案 0 :(得分:1)
您必须在return coins;
的and方法上添加change
,但是可以按照自己的方式进行保存。返回和更改数组是一种代码味道,因为该方法同时对对象进行操作(对其进行修改)并返回结果。
要使其生效,您可以按以下方式定义denomination
方法:
public static List<Integer> denominations(int amount) {
List<Integer> result = new ArrayList<Integer>();
change(amount, result, 0);
return result;
}
编辑:
列表为空,因为唯一更改的位置在这里:
coins.add(DENOMINATIONS[pos]);
change(remaining - DENOMINATIONS[pos], coins, pos);
coins.remove(coins.size() - 1);
添加和删除元素的位置。这是您所写的内容,使其为空:)
Edit2:
我建议传递第二个对象,该对象是您要返回的列表的副本,并且未经修改。
答案 1 :(得分:1)
您似乎假设java是通过引用传递的,这是不正确的。 Java方法按值传递。
我已经更新了您的代码:
更改方法:
private static List<Integer> change(int remaining, List<Integer> coins, int pos) { // Updated method return type;
if (pos < 0 || pos >= DENOMINATIONS.length) { // check if position is invalid
return new ArrayList<>(); // return an empty list
}
if (remaining == DENOMINATIONS[pos]) { // check if remaining is equal to denominations[pos]
coins.add(DENOMINATIONS[pos]); // add the denominations to the coins result
return coins; // return the result
} else if (remaining > DENOMINATIONS[pos]) { // check if remaining is greater than denominations[pos]
coins.add(DENOMINATIONS[pos]);// add the possible denominations to the coins result
remaining = remaining - DENOMINATIONS[pos]; // calculate the new remaining
if (remaining >= DENOMINATIONS[pos]) { // check if remaining is greater than or equal to denominations[pos]
return change(remaining, coins, pos); // stick to this position
} else {
return change(remaining, coins, pos + 1); // increment pos to go to the lower denominations
}
} else if (remaining < DENOMINATIONS[pos]) { // check if remaining is lesser than denominations[pos]
if (coins.isEmpty()) { // if coins is empty then go to the next denomination
return change(remaining, coins, pos + 1);
} else {
coins.remove(coins.size() - 1); // remove the previous denomination
return change(remaining + DENOMINATIONS[pos - 1], coins, pos); // go back to the previous remaining and // try this DENOMINATIONS[pos]
}
}
return coins;
}
面额方法:
public static List<Integer> denominations(int amount) {
return change(amount, new ArrayList<Integer>(), 0);
}
输入:13
输出:[5, 5, 3]
答案 2 :(得分:0)
fileLocation
应该返回布尔值,表示是否已找到答案。
change
的主体看起来像这样:
change