2017-01-05 13 views
1

再帰的メソッドの基本条件については不思議です。私の講義では、先生が何度か基本条件を様々な方法で書き記していることがわかります。私はこのようなプライベートな方法で基本条件を記述する場合は、公共の方法でここ再帰的メソッドの基本条件

基本条件

public E find(E x) { 
    if (x == null) { 
    return null; 
    } 
    return find(root,x); 
} 

private E find(BinaryNode<E> n, E x) { 
    if (n.element.equals(x)) { 
     return n.element; 
    } 
    else if (x.compareTo(n.element) < 0) { 
     return find(n.left, x); 
    } 
    else { 
     return find(n.right, x); 
    } 
} 

が、それはOKです:

public E find(E x) { 
    return find(root,x); 
} 

private E find(BinaryNode<E> n, E x) { 
    if (n == null) { 
     return null; 
    } 
    else if (n.element.equals(x)) { 
     return n.element; 
    } 
    else if (x.compareTo(n.element) < 0) { 
     return find(n.left, x); 
    } 
    else { 
     return find(n.right, x); 
    } 
} 
+5

質問に関連するコードをここに入力してください。死ぬかもしれない外部のリンクに依存しないでください。 –

+3

'n.left'(または' n.right')が 'null'の場合、最初のケースで何が起こると思いますか? –

+2

'if(n == null)'ではなく 'if(x == null)'を意味しましたか? – Berger

答えて

4

まあ、私は希望このしてください参照してください。次のバージョンを選択してください:

なぜですか?それは正しいからです。他の1つはツリーにそのような要素がない場合、NullPointerExceptionにつながりません。

OPポストに表示される2番目の質問は、基本条件をpublicprivateのどちらにするかです。唯一可能な正解は、各再帰メソッドが再帰が終了する基本条件を持たなければならないということです。

publicメソッドはによってと呼ばれるので、入力を検証する必要があります。彼らは、パラメータが有効であると仮定することはできません。 privateメソッドは、パラメータが正常であり、ロジックに集中できると想定できます。私はあなたの公開方法に置く

条件は次のようになります。

public E find(E x) { 
    if (<x isn't valid - for example null and nulls are not allowed for values>) { 
     //do something here - exception or null 
    } 
    return find(root,x); 
} 
それはプライベートな検索のための入力が... `正しいだろうことを確認するために立って

。それはあなたがしなければならないことです。

+0

パブリックメソッドで基本条件を書いてもよろしいですかありがとうございましたか? – Joe

+0

@Joe分の答えで説明します。 – xenteros

+0

まあ、概念的には最初のバージョンが優れています。これは、再帰呼び出しが使用され、コードをきれいに保つことを見ることによってまっすぐに指示します。また、パフォーマンスの向上である 'find(..)'メソッドに対する余分な呼び出しを節約します。 – MaxZoom

関連する問題