ジェームズ:
私は、再帰の概念にブラッシュアップし、バイナリツリーで働いていました。私はリターンを使用しない場合に再帰呼び出しや他の回でreturn文を使用してのインスタンス間の違いを理解していません。私は私の質問を説明するためのコードを与えるでしょう。
ここでは値がBSTに存在するかどうかをチェックし、その関数は次のようになります。
public boolean containsNodeRecursive(Node current, int value) {
if (current == null) {
return false;
}
if (value == current.data) {
return true;
}
//HERE, THE RECURSIVE CALL IS PRECEDED BY A RETURN STATEMENT
return value < current.data
? containsNodeRecursive(current.left, value)
: containsNodeRecursive(current.right, value);
}
}
ここではBSTにデータを挿入するための機能は次のとおりです。
public Node insert(Node current, int data) {
if (current == null) {
return createNode(data);
} else if (data < current.data) {
//RECURSIVE CALL HERE WITHOUT USE OF A RETURN STATEMENT
current.left = insert(current.left, data);
} else if (data > current.data) {
current.right = insert(current.right, data);
}
return current;
}
私は私の質問がに沸くと思う:「?とき、我々は再帰呼び出しを返す必要がありますし、ときに我々はいけません」
Hylianピカチュウ:
提示機能の2種類がありますので、我々は従う必要がある2つの別々のルールがあります。
あなたが設けられた第一の機能を取ります:
public boolean containsNodeRecursive(Node current, int value) {
if (current == null) {
return false;
}
if (value == current.data) {
return true;
}
//HERE, THE RECURSIVE CALL IS PRECEDED BY A RETURN STATEMENT
return value < current.data
? containsNodeRecursive(current.left, value)
: containsNodeRecursive(current.right, value);
}
}
この機能は、単一の目標値を見つけて、それを返すことを意図しています。我々は我々がテストされているノードの単一子によって提供されます知っている値を返すようにしたい場合は、このケースでは、再帰呼び出しを返します。
しかし、挿入の例を取ります:
public Node insert(Node current, int data) {
if (current == null) {
return createNode(data);
} else if (data < current.data) {
//RECURSIVE CALL HERE WITHOUT USE OF A RETURN STATEMENT
current.left = insert(current.left, data);
} else if (data > current.data) {
current.right = insert(current.right, data);
}
return current;
}
このコードは、タスクの異なるタイプを達成することを意図しています。むしろ、単一の目標値を求めているよりも、この再帰関数は、既存のツリーを修正することを意図しています。この場合、我々は既存のツリー(または重複する値)にしたいだけの変更を返します。