簡體   English   中英

如何中斷遞歸函數的多個實例調用?

[英]How to break from multiple instances calls of a recursive function?

我正在創建一個遞歸函數,它將找到圖中兩個節點之間的路徑。 只有當節點不重復時才會找到路徑。 如果一個節點連接到另外兩個節點,將創建遞歸函數的兩個實例。 如果兩者都有正確的路徑,則將設置最后找到的路徑而不是第一個(行 this.nodePath = clonedNodePath;)。 如何在找到路徑時中斷所有遞歸調用,而不僅中斷當前遞歸調用實例? (我不想拋出異常)

private void process(String currentNodeId, List<String> currentNodePath) {
        FlowNode currentFlowNode = modelInstance.getModelElementById(currentNodeId);

        List<String> clonedNodePath = new ArrayList<>(currentNodePath);

        if (currentFlowNode == null || clonedNodePath.contains(currentNodeId)) return;

        clonedNodePath.add(currentNodeId);

        if (currentNodeId.equals(finishNodeId)) {
            this.nodePath = clonedNodePath;
            return;
        }

        currentFlowNode.getOutgoing()
                .stream()
                .forEach(sequenceFlow -> process(sequenceFlow.getTarget().getId(), clonedNodePath));

}

主要問題在於對傳出 egdes 的迭代。

您選擇使用 Java8 流執行此操作,這不允許您提前中止(挑剔:您可以解決該“限制”,但這很笨拙)。

將其更改為經典的for循環,您的問題基本上就會消失。 讓您的process()方法返回一個布爾成功指示,並且在循環內部,如果它給出 true,則在這個process()遞歸調用中返回 true。

或者更優雅:讓process()方法返回一個Optional<List<String>> ,如果失敗則為空,或者如果成功則填充路徑。 然后你也擺脫了通過this.nodePath進行通信。 而 process() 方法最好命名為findPath()

PS 我知道使用流很流行,但在某些情況下它們根本不是合適的工具。

暫無
暫無

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

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