2016-06-01 7 views
1

この質問はスタックオーバーフロー上の次のコメントから、私の心の中で起こった:再帰的メソッドは、クラス属性/ dataをパラメータとして使用しますか?

Q:なぜJavaで通常の静的再帰的な方法はありますか?

回答:再帰的な方法/アルゴリズムは、一般的にそれのパラメータではなく(おそらく必要があります) は、静的行うことができ、インスタンス変数に依存しないインスタンスvariables.Any方法 によってのみ を制御されるため。

インスタンスで制御されるのではなく、メソッドパラメータであるクラスには、他にもたくさんのメソッドを定義できます。単純な例の1つは、引数なしのコンストラクタから作成されたオブジェクトがパラメータ化されたメソッドを呼び出す場合です。このメソッドは実際にパラメータによって制御されます。

次に、例外が1つしか見つかりませんでした。メソッド内のパラメータもクラス属性である場合、各インスタンスに従って属性が変更されるため、メソッドを静的にすることはできません。つまり、再帰的メソッドはクラス属性であるパラメータを決して使用しません。

私が間違っている場合は私を修正してください。私が正しいなら私に例を与えてください。私が引用しているスタックオーバーフローポストはhere.

+0

静的メソッドを保証するパラメータではなく、インスタンス変数です。インスタンス変数を取得または設定するメソッドは、静的にすることはできません。デフォルトのコンストラクタで初期化されたオブジェクトでも、インスタンスメソッドで使用できるインスタンス変数があります。 – 4castle

+0

インスタンス変数に依存しない場合は静的にすべきであるというコメントはまったく間違っています。それを信じてはいけません。 –

+0

あなたの質問の前提は間違っています。 – Raedwald

答えて

1

です。メソッドがインスタンス変数やメソッドを参照していない場合、静的にすることができます。それはそれが静的にされるべきではありません(実際にはこの質問の範囲にはありません)。そのロジックを再帰的メソッドに適用することは、おそらく共通の仮定を作ることですが、必ずしも正しいとは限りません。 do_something_with_that_file()は、その後、まだ再帰的な方法は、静的なことができませんでした、インスタンスメソッドである場合、

doForEveryFile(File root) 
{ 
    if (root.isFile()) do_something_with_that_file(root); 
    else if (root.isDirectory()) 
    { 
    for (File next_file : root.listFiles()) doForEveryFile(next_file); 
    } 
} 

しかし、その場合には:

共通再帰的な操作は、ファイル、のようなものを反復処理されます。それが静的であれば、これは静的な再帰的メソッドである可能性があります。したがって、この単純なケースでも、再帰自体が静的であるかどうかの明確な要因ではないことは明らかです。完全に静的だ

// sum all numbers from one to our given value 
class StaticRecursive { 
    public static int sumTo(int max) { return recursiveSum(); } 
    private static int recursiveSum(int currentSum, int currentValue, int max) 
    { 
    if (currentValue == max) return currentSum; 
    else return recursiveSum(currentSum + currentValue, currentValue + 1, max); 
    } 
} 

我々はまた、静的な数学の場合、バージョン1を書くことができます。私の代わりにそれが好きで書くことができる:

class InstanceRecursive { 
    private int max; 
    private int sum; 
    public int sumTo(int max) { 
    this.max = max; 
    this.sum = 0; 
    return recursiveSum(0); 
    } 
    public void recursiveSum(int currentValue) 
    { 
    if (currentValue == this.max) return; 
    else { 
     sum += currentValue; 
     recursiveSum(currentValue + 1); 
    } 
    } 

は、これらの2は基本的に同じもの、インスタンス変数、インスタンス変数と1なしのいずれかを実行します。違いは何ですか?あまりない。インスタンスのバージョンは、より少ないスタックスペースを使用しますが、それはそれです。とにかく、staticはインスタンス変数/メソッド参照と関係があります(存在しない場合は静的である可能性があります)。哲学的には、メソッドが静的である可能性がある場合、それはなぜそのクラスの一部ですか?再帰は考慮すべき興味深いケースかもしれませんが、それが静的であるかどうかについての再帰的メソッドに関して特別で特別なものは何もありません。

関連する問題