0

リターンがありますが、オカレンスが呼び出された"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
4

1 に答える 1

4

奇妙なことは何も起こっていません。これが発生する可能性のあるコード パスが少なくとも 1 つあります。

ネストされた呼び出しでは、これが実行されます。

        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");      
    }

つまり、見ている 2 行、再帰メソッドの 1 回の呼び出し中は相互に排他的ですが、ネストされた 2 つの呼び出し間では相互に排他的ではありません。そして、それらが出力するメッセージは、出力の場合と同様に、順番に表示できます。

于 2013-05-04T10:20:04.663 に答える