2016-06-01 8 views
1

Diese Frage stellte ich in meinem Kopf aus dem folgenden Kommentar auf Stack-Überlauf:Nimmt eine rekursive Methode jemals ein Klassenattribut/Datenfeld als Parameter?

F: Warum ist rekursive Methode in der Regel statisch in Java?

Antwort: Weil eine rekursive Methode/Algorithmus allgemein allein durch die Parameter gesteuert wird und nicht durch Instanz variables.Any Methode , die auf Instanzvariablen beruht nicht kann (und wahrscheinlich sollte) sein statisch gemacht.

Es gibt viele andere Methoden, die in einer Klasse definiert werden können, die nicht von den Instanzen gesteuert werden, sondern Methodenparameter. Ein einfaches Beispiel wäre, wenn ein Objekt, das von einem Konstruktor ohne Argumente erstellt wird, eine parametrisierte Methode aufruft, wird die Methode wirklich von den Parametern gesteuert.

Dann habe ich nur eine mögliche Ausnahme gefunden: Wenn die Parameter in einer Methode auch Klassenattribute sind, dann kann die Methode nicht statisch sein, weil die Attribute für jede Instanz geändert werden. Das bedeutet, dass die rekursive Methode niemals Parameter als Klassenattribute akzeptiert.

Bitte korrigieren Sie mich, wenn ich falsch liege. Bitte geben Sie mir ein Beispiel, wenn ich richtig liege. Der Stack-Überlauf-Post, den ich zitiere, ist here.

+0

Es sind keine Parameter, die eine statische Methode rechtfertigen, es sind Instanzvariablen. Wenn die Methode Instanzvariablen in irgendeiner Weise erhält oder setzt, kann sie nicht statisch sein. Selbst ein mit dem Standardkonstruktor initialisiertes Objekt verfügt über Instanzvariablen, die in einer Instanzmethode verwendet werden können. – 4castle

+0

Der Kommentar, den Sie sagen, dass, wenn es sich nicht auf Instanzvariablen verlässt, es statisch gemacht werden sollte, völlig falsch ist. Bitte glaube es nicht. –

+0

Die Prämisse Ihrer Frage ist falsch. – Raedwald

Antwort

1

Wenn eine Methode keine Instanzvariablen oder Methoden referenziert, könnte sie statisch gemacht werden. Das bedeutet nicht, dass es statisch gemacht werden sollte (aber das ist nicht wirklich im Rahmen dieser Frage). Die Anwendung dieser Logik auf rekursive Methoden führt einige vielleicht gemeinsame Annahmen, ist aber nicht unbedingt für sich selbst richtig.

Eine gemeinsame rekursive Operation Dateien iterieren, so etwas wie:

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); 
    } 
} 

Aber in diesem Fall, wenn do_something_with_that_file() eine Instanzmethode ist, dann noch die rekursive Methode nicht statisch sein könnte. Wenn es statisch ist, könnte dies eine statische rekursive Methode sein. Selbst bei diesem einfachen Fall sollte klar sein, dass die Rekursion selbst kein eindeutiger Treiber für die Wahrscheinlichkeit ist, statisch zu sein oder nicht.

könnten wir schreiben auch einen mathematischen Fall, Version ein, statisch:

// 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); 
    } 
} 

Das völlig statisch ist. Ich könnte stattdessen schreiben Sie es mögen:

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); 
    } 
    } 

Die beiden im Grunde das gleiche tun, eine ohne Instanzvariablen, eine mit Instanzvariablen. Was ist der Unterschied? Nicht viel. Die Instanzversion wird weniger Stapelspeicher verwenden, aber das ist es auch.

Wie auch immer, zusammenfassend hat static mit Instanzvariablen/Methodenreferenzen zu tun (wenn keine, könnte es statisch sein). Wenn eine Methode statisch sein könnte, warum ist sie dann ein Teil dieser Klasse? Rekursion könnte ein interessanter Fall sein, den es zu beachten gilt, aber es gibt nichts Spezielles oder Spezifisches an einer rekursiven Methode, ob es statisch wäre oder nicht.