[英]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.