簡體   English   中英

使用遞歸時返回根節點處的路徑

[英]Return Path at the root node when using recursion

我正在嘗試為子集和問題創建一個遞歸函數。 我創建了一個受這個答案啟發的功能。

問題:我試圖從數組中選擇一些元素(例如[50,40,30,20]),其總和被賦予我的定義為sum (例如100)。

我已經根據答案中的建議創建了稍微修改過的函數。

從前面拾起並選擇它或不選擇它。

如果我選擇一個元素,縮小列表中的總和將小於所選元素,否則如果我不選擇該元素,縮小列表中的總和將是原始元素。

但是,我發現最困難的事情是返回跟蹤到遞歸調用的根節點的路徑。 當我到達匹配總和的節點時,我能夠打印路徑。

這是我的功能:

private static boolean findSumFromSubList(ArrayList<Integer> set, Integer sum, ArrayList<Integer> result) {

    if (sum < 0)
        return false;

    if (sum == 0) {
        // Got it! Awesome! Print it!
        System.out.println(result);
        return true;
    }

    if (set.size() == 0 && sum != 0)
        return false;

    ArrayList<Integer> newSet = new ArrayList<>(set);
    newSet.remove(0);

    System.out.println("Left: Picking up " + set.get(0));
    result.add(set.get(0));
    if (findSumFromSubList(newSet, sum - set.get(0), new ArrayList<>(result))) {
        return true;
    }

    System.out.println("Right: NOT Picking up " + set.get(0));
    result.remove(result.size()-1);
    if (findSumFromSubList(newSet, sum, new ArrayList<>(result))) {
        return true;
    }

    return false;
}

我這樣稱呼它:

    ArrayList<Integer> pair = new ArrayList<>();
    pair.add(50);
    pair.add(40);
    pair.add(30);
    pair.add(20);
    ArrayList<Integer> result = new ArrayList<>();
    boolean resultBool = findSumFromSubList(pair, 100, result);

    System.out.println("bool: " + resultBool + ", result: " + result);

我得到的輸出是:

Left: Picking up 50
Left: Picking up 40
Left: Picking up 30
Right: NOT Picking up 30
Left: Picking up 20
Right: NOT Picking up 20
Right: NOT Picking up 40
Left: Picking up 30
Left: Picking up 20
[50, 30, 20]
bool: true, result: [50]

所以我能夠在遞歸中獲得輸出,但是如何將該值返回到根調用函數。 因為result只返回50。

而不是復制result ,嘗試傳遞它,以便它可以在recurses時進行修改。

private static boolean getSum(ArrayList<Integer> set, Integer sum, LinkedList<Integer> result) {
    // ...

    System.out.println("Left: Picking up " + set.get(0));
    result.add(set.get(0));
    if (getSum(newSet, sum - set.get(0), result)) {
        return true;
    }
    result.removeLast();

    System.out.println("Right: NOT Picking up " + set.get(0));
    if (getSum(newSet, sum, result)) {
        return true;
    }
}

您可以應用類似的邏輯進行set ,但我會將其作為練習留給讀者。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM