0

これは、私のコードの関連部分を含むコードの概要です。

empprint 関数内で、bfs 印刷関数を呼び出します。この関数は、印刷する必要があるすべての印刷が完了するまで再帰的に呼び出します。その後、empprint 関数に戻るはずです。しかし、bfsprint の return ステートメントで empprint に戻ることはありません。

私が考えることができる1つの考えられる理由は、bfsprintが再帰的にそれ自体を呼び出すため、empprint関数の代わりにそれを呼び出した最後のbfsprintメソッドにのみ戻ることですが、それは私の問題を解決していないようです. 実行が終了しないコードに行き詰まっています。

void node::empprint(node* myroot)
{
    //do something
    bfsprint(c);
    cout<<"pt 5"; //this cout is not reached
    return;
}

void node::bfsprint(Linklist<node*> noddy)
{
    // lot of code to implement breadth-first search. No issue

    if(c.getHead()==NULL) cout<<"1" //this does print 1 to output
    if(c.getHead()==NULL) return; //I think this should send me back to empprint
                                  // and print "pt 5" on output but program hangs.
                                  // instead of this happening
    bfsprint(c);
}

これがメソッド内の他のコードの影響を受けている可能性があると誰かが考えている場合は、追加しますが、そうではないと思います.

4

1 に答える 1

1

コール スタックが次のようになっている場合:

node::empprint
node::bfsprint
node::bfsprint

最後の呼び出しから戻ると、

node::empprint
node::bfsprint

したがって、まだ N 呼び出しが node::empprint に戻ることはありません。

クラスにブール値を設定して元に戻すこともできますが、それは少しハックです..

void node::bfsprint(Linklist<node*> noddy)
{
   if ( something ) { m_unwindstack = true; }

   // setting the bool to force returning early/stop recursion once m_unwindstack  is true to get back to empprint
   if ( m_unwindstack ) { return; }
}

編集: ところで、Linklist で何かをしている場合、データのコピーを渡してからの変更は見られません。参照 Linklist& を渡す必要があります。

また、Linklist は独自のクラスのように見えますか? したがって、参照を使用しない場合は、コピー可能であることを確認してください。そうしないと、悪いことが起こります。

于 2013-09-14T10:34:44.403 に答える