我有一个回复,但是你可以看到在调用"this will not print"
之后不应该到达的行return
。
发生了什么事?
这是整个程序,目前是一份粗略的副本......:
private void greedySearch (String lookForNode)
{
// Note: Available vars
// reqStartNode
// reqEndNode
// Search through entire tree looking for...
System.out.println("Searching through entire tree looking for "+lookForNode);
for (int i = 0; i < treeList.size(); i++) {
Data currentNode = treeList.get(i);
// ... reqStartNode
if (currentNode.getNodeName().equals(lookForNode))
{
System.out.println("Found matching node. currentNode.getNodeName=" + currentNode.getNodeName()+" lookForNode="+lookForNode);
// Check to see if there's any children?
if (currentNode.childrenList.size() > 0)
{
// Find smallest child by node
double smallestHeuristic = currentNode.childrenList.get(0).getHeuristic();
String smallestNode = currentNode.childrenList.get(0).getNodeName();
for (int ii = 1; ii < currentNode.childrenList.size(); ii++)
{
if (currentNode.childrenList.get(ii).getHeuristic() < smallestHeuristic)
{
smallestHeuristic = currentNode.childrenList.get(ii).getHeuristic();
smallestNode = currentNode.childrenList.get(ii).getNodeName();
}
}
// Check to see if smallest child by node is reqEndNode
if (smallestNode == reqEndNode)
{
System.out.println("FOUND GOAL "+smallestNode);
// Quit because we found the answer
return;
}
// Expand that node
else
{
greedySearch (smallestNode);
}
}
// No children, we've reached the end
else
{
System.out.println("We've reached the end at "+currentNode.getNodeName());
// Quit because we've reached no further children to expand
return;
}
System.out.println("This will not print");
}
else
{
System.out.println("Skipped node "+currentNode.getNodeName());
}
}
System.out.println("FINISHED SEARCH");
}
修改
在我调用递归过程后,我意识到正确的解决方案是return
:
greedySearch (smallestNode);
// Quit because we are now going recursive, our job here is done
return;
我的输出现在是:
Searching through entire tree looking for S Skipped node A Skipped node B Skipped node C Skipped node D Skipped node E Skipped node F Skipped node G Skipped node G Found matching node. currentNode.getNodeName=S lookForNode=S Searching through entire tree looking for A Found matching node. currentNode.getNodeName=A lookForNode=A Searching through entire tree looking for B Skipped node A Found matching node. currentNode.getNodeName=B lookForNode=B Searching through entire tree looking for C Skipped node A Skipped node B Found matching node. currentNode.getNodeName=C lookForNode=C We've reached the end at C
答案 0 :(得分:4)
没有什么奇怪的事情发生。我可以看到至少一个可能发生这种情况的代码路径。
在嵌套调用中,执行此操作:
else
{
System.out.println("We've reached the end at "+currentNode.getNodeName());
// Quit because we've reached no further children to expand
return;
}
然后回到外线电话:
else
{
greedySearch (smallestNode); // Resuming from here...
}
}
else
{
// ...all this is skipped (because we are in the else block
// of an if that was true)...
}
// ...and this is printed.
System.out.println("This will not print");
}
换句话说,虽然你正在查看的那两行是,实际上,在你的递归方法的一次调用中互相排斥,但它们在两个嵌套调用之间并不相互排斥。并且它们打印的消息可以按顺序出现,就像输出中的情况一样。