宿題として、私はバイナリ検索ツリーを実装しており、後で変更/削除できるように、データの位置を検索する部分を行っていました。コード:C++再帰関数戻り値
node*& bst::search(data& x, node*& pos) {
if (pos->get().num == x.num) {
return pos;
}
if (pos->right != NULL) search(x, pos->right);
if (pos->left != NULL) search(x, pos->left);
}
私はsearch(data_to_find, root)
を呼び出します。私の例では、私は、このフォームの整数のツリーを持っていた:
1
2
3
私は要素3を検索したい1.ルートポインティングで、私は3へのポインタを取得することを期待しますが、毎回ましたこの関数はルート自体を返します。それから、値が返されないfooの最初のインスタンスと関係があったかもしれないと思ったので、search(x, pos->right)
をreturn search(x, pos->right)
に変更しました。これは、私はちょうど私が文がfalseの場合、それは静止画の場合に返すために何を指定していないが、それは
int foo(int x = 0) {
if (x == 1) {
return x;
}
x++;
foo(x);
}
を返すかを理解するために、次のダミー関数をいくつかの実行を実行しようとしました、私は混乱して作られました作品や出力1.私は多分foo(0)
はちょうど私はこの試みたことを確認するために、foo(1)
は再帰で返さどんな返されたと思った:
int boo() {
return 1;
}
int foo() {
boo();
}
をし、明らかに、「fooが値を返さなければなりません」エラーをもたらした、foo()
と呼ばれますboo()
〜return boo()
を修正しました。 Sooo私の質問はなぜ最初のケースがrootを出力しているのですか?そして、なぜ2番目のケースも機能していますか?
'return'ステートメントなしで' void'とは異なる何かを返す関数の終わりから流出することは、未定義の動作です。あなたは幸運にも[鼻のデーモン](http://www.urbandictionary.com/define.php?term=nasal%20demons)はありませんでした! –
@DietmarKühlは鼻のdeamonsへの参照のためにありがとう:) –
'node *&'を返すのは奇妙に思えますが、 'search'への再帰呼び出しの結果で何もしません有効な 'return'を持っていません)。 – crashmstr