java用递归的方式写n_java-使用递归将其元素加起来为n的子集的列表
我正在編寫此函數,該函數要使用整數打印給定列表的所有子列表.這些整數的總和應等于給定的數字n.還有一個以值0開頭的幫助變量i.列表和每個子列表都是ArrayList.因此,該方法現在看起來像這樣:
public static void printSublists(ArrayList numbers, ArrayList sublist, int n,
int i) {
if (sublist.sum() == n) {
System.out.println(sublist.toString());
}
else {
for (int j = 0; j < numbers.size(); j++) {
sublist.add(numbers.get(i));
printSublists(numbers, sublist, n, i + 1);
sublist.remove(numbers.get(i));
}
}
}
當然我已經有了sum()方法.該方法現在執行此操作:
假設數字= [1、3、4]且n == 4,則該方法應打印[4]和[1,3],但僅打印[1、3]?我認為for循環必須做到這一點對嗎?如果有人讓我走上正確的道路,我將不勝感激.
更新:
我給該方法的值:
numbers = [1, 3, 4]
n = 4
i = 0
sublist = []
更新2:
我忘了說我希望它是遞歸的:)
解決方法:
當您看到第一個子列表的總和為n時,遞歸停止.問題不只是循環,而是退出標準.當子列表的長度為0時,遞歸函數應停止.
在這里,我只是為您的問題寫了一個可行的遞歸解決方案.情況有所不同,但我無法解決您的問題.當您從一個空的子列表開始時,我選擇使用完整列表來初始化遞歸,并將其劃分為較小的子列表.這將創建一個樹狀結構:
[1234]
[123] [234]
[12] [23] [34]
[1][2] [3] [4]
我們立即看到,我們必須“向右”走直到到達第一片葉子(1),然后才“向左”走.這樣,我們只訪問一次所有子列表.
這是用Java編寫的想法:
public static void main (String[] args) {
ArrayList list = new ArrayList();
list.add(1);
list.add(3);
list.add(4);
list.add(0);
printSublists(list, list, 4, true, 0);
}
public static void printSublists(List numbers, List sublist, int n, boolean walkRight, int level) {
// the test
if (sum(sublist) == n)
System.out.println(sublist);
// the exit criteia (leaf reached)
if (sublist.size() == 1)
return;
// visit the right sublist
if (walkRight)
printSublists(numbers, sublist.subList(0, sublist.size()-1), n, walkRight, level+1);
// we only walk the right path once
walkRight = false;
// visit the left sublist
printSublists(numbers, sublist.subList(1, sublist.size()), n, walkRight, level+1);
}
這就是輸出:
[1, 3]
[4]
[4, 0]
標簽:backtracking,subset-sum,java,recursion
來源: https://codeday.me/bug/20191101/1984691.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的java用递归的方式写n_java-使用递归将其元素加起来为n的子集的列表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java多态调用优先级_关于java的多
- 下一篇: jsp图片墙_JS实现的非常漂亮的3D立