日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java用递归的方式写n_java-使用递归将其元素加起来为n的子集的列表

發布時間:2025/3/20 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的子集的列表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。