Java 列表组合

Java 列表组合,java,recursion,Java,Recursion,如何在java中列出方法相互堆叠的组合。要打印组合,需要在amount==0时打印 要做到这一点,您需要累计已完成的工作以获得该值,即哪些硬币已应用于金额值 一种方法是构建一个字符串,在递归调用中添加空格和硬币值。结果字符串将以空格开头,因此打印时必须跳过它 public static int combo(int amount, int currentCoin, String combo) { // Added:

如何在java中列出方法相互堆叠的组合。

要打印组合,需要在amount==0时打印

要做到这一点,您需要累计已完成的工作以获得该值,即哪些硬币已应用于金额值

一种方法是构建一个字符串,在递归调用中添加空格和硬币值。结果字符串将以空格开头,因此打印时必须跳过它

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: ^^^^