package search.uninformed.iterativedeepening; import search.Node; public class IterativeDeepening { public Node iterativeDeepening(final Node node, final Node target) { var lowBarrier = 0; Node resultNode; do { resultNode = depthFirstSearch(node, target, 0, lowBarrier++); } while (resultNode == null); return resultNode; } private Node depthFirstSearch(final Node node, final Node target, int depth, final int barrier) { if (node.isTargetReached(target)) { return node; } final var newNodes = node.generateSuccessors(); while (!newNodes.isEmpty() && depth < barrier) { final var resultNode = depthFirstSearch(newNodes.get(0), target, ++depth, barrier); if (resultNode != null) { return resultNode; } newNodes.remove(0); } return null; } }