Java 列表组合
如何在java中列出方法相互堆叠的组合。要打印组合,需要在amount==0时打印 要做到这一点,您需要累计已完成的工作以获得该值,即哪些硬币已应用于金额值 一种方法是构建一个字符串,在递归调用中添加空格和硬币值。结果字符串将以空格开头,因此打印时必须跳过它Java 列表组合,java,recursion,Java,Recursion,如何在java中列出方法相互堆叠的组合。要打印组合,需要在amount==0时打印 要做到这一点,您需要累计已完成的工作以获得该值,即哪些硬币已应用于金额值 一种方法是构建一个字符串,在递归调用中添加空格和硬币值。结果字符串将以空格开头,因此打印时必须跳过它 public static int combo(int amount, int currentCoin, String combo) { // Added:
public static int combo(int amount, int currentCoin, String combo) {
// Added: ^^^^^^^^^^^^^^
if (amount == 0) {
System.out.println(combo.substring(1)); // <<<<< Added
return 1;
}
if (amount < 0) {
return 0;
}
int nCombos = 0;
for (int coin = currentCoin; coin < coins.length; coin++) {
nCombos += combo(amount - coins[coin], coin, combo + " " + coins[coin]);
// Added: ^^^^^^^^^^^^^^^^^^^^^^^^^^^
}
return nCombos;
}
输出
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5
1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2
1 1 1 1 1 1 1 1 1 1 1 1 1 2 5
1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2
1 1 1 1 1 1 1 1 1 1 1 2 2 5
1 1 1 1 1 1 1 1 1 1 2 2 2 2 2
1 1 1 1 1 1 1 1 1 1 5 5
1 1 1 1 1 1 1 1 1 2 2 2 5
1 1 1 1 1 1 1 1 2 2 2 2 2 2
1 1 1 1 1 1 1 1 2 5 5
1 1 1 1 1 1 1 2 2 2 2 5
1 1 1 1 1 1 2 2 2 2 2 2 2
1 1 1 1 1 1 2 2 5 5
1 1 1 1 1 2 2 2 2 2 5
1 1 1 1 1 5 5 5
1 1 1 1 2 2 2 2 2 2 2 2
1 1 1 1 2 2 2 5 5
1 1 1 2 2 2 2 2 2 5
1 1 1 2 5 5 5
1 1 2 2 2 2 2 2 2 2 2
1 1 2 2 2 2 5 5
1 2 2 2 2 2 2 2 5
1 2 2 5 5 5
2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 5 5
5 5 5 5
组合=29
您必须再次删除它,因为您正在更新共享对象。通过您的方法进行的所有级别的递归都将共享同一个列表对象,这与此处显示的字符串版本不同,其中每个递归将接收不同的字符串。这很有意义!但是我每次都尝试在循环中创建一个新的列表,就像字符串一样,但是它给了我一个不正确的输出。你知道为什么吗?@user11452926取决于你是如何制作一个新的列表的,我想。如果您使用newList=list,那么您只是对同一列表进行了另一次引用。如果您创建了newList=new ArrayDequelist,那么您就正确地复制了现有列表。谢谢!在我看来,字符串和列表都是共享对象。你知道我在哪里可以读到更多关于这个的信息吗?@user11452926字符串是不可变的,所以combo++coins[coin]会创建一个新字符串,即每次调用都会收到一个不同的字符串,即该字符串不会在调用之间共享。
System.out.println("combo = " + combo(20, 0, ""));
// Added: ^^^^