2016-09-04 12 views
1

Ich spielte mit einigen rekursiven Programmierung. Ich habe eine Variable, um meine Tiefe zu verfolgen (d). Das Konsolenprotokoll zeigt mir, wo sich das Programm gerade befindet.Probleme mit Variablen in rekursive Programmierung in Javascript

var Test = function(){ 
 
\t this.rekursiv = function(d){ 
 
\t \t this.d = d; 
 
\t \t console.log("case 1 granted, d: " + this.d); \t \t 
 
\t \t if(this.d < 3) \t { 
 
\t \t console.log("going deeper.."); 
 
\t \t this.rekursiv(this.d + 1); 
 
\t \t console.log("going back.."); \t \t 
 
\t \t } 
 
\t \t console.log("d: " + this.d ); 
 
\t \t } 
 
} \t 
 
t = new Test(); 
 
t.rekursiv(0);

Hier ist mein Problem: Immer, wenn ich eine Ebene tiefer gehen, ich "this.d + 1" auf das nächste Level zu kommen. Howeverver, Debuggen des Codes (mit der console.log) zeigt, dass d nicht nur in einer Ebene/Tiefe, sondern in jeder Ebene/Tiefe geändert wird.

Warum ist das so? Wie kann ich verhindern, dass der Code dies tut?

+3

'this.d' ist keine Variable. Es ist eine Eigenschaft für ein Objekt, bei dem es sich um dasselbe Objekt handelt, das im rekursiven Aufruf als Wert von this verwendet wird. Es gibt keinen Grund für eine separate Variable in Ihrem Code, da Sie bereits den Parameter "d" haben. –

+0

Sie können es so schreiben: 'Funktion Test (d) {wenn (d <3) {console.log (d); Test (d + 1); console.log (d)} else console.log ("Basisfall")} '. Das Problem mit Ihrer Funktion ist, dass es nichts zurückgibt. Der Basisfall führt nur einen Nebeneffekt aus ('console.log'). – ftor

Antwort

3

Warum verwenden Sie die lokale Variable nicht d?

Mit this.d legen Sie eine Eigenschaft der Instanz Test fest. Und mit dem Ende von rekursiv, ändern Sie den Wert nicht auf den vorherigen Wert zurück.

var Test = function() { 
 
     this.rekursiv = function(d) { 
 
      console.log("case 1 granted, d: " + d); 
 
      if (d < 3) { 
 
       console.log("going deeper.."); 
 
       this.rekursiv(d + 1); 
 
       console.log("going back.."); \t \t 
 
      } 
 
      console.log("d: " + d ); 
 
     } 
 
    }, 
 
    t = new Test; 
 

 
t.rekursiv(0);

Eine andere Lösung wäre, this.d zu Beginn der Funktion rekursiv zu erhöhen und es am Ende zu verringern.

var Test = function() { 
 
     this.d = 0; 
 
     this.rekursiv = function() { 
 
      this.d++; 
 
      console.log("case 1 granted, d: " + this.d); \t \t 
 
      if (this.d < 3) \t { 
 
       console.log("going deeper.."); 
 
       this.rekursiv(); 
 
       console.log("going back.."); \t \t 
 
      } 
 
      console.log("d: " + this.d ); 
 
      this.d--; 
 
     } 
 
    }, 
 
    t = new Test; 
 

 
    t.rekursiv();

2

Entfernen Sie diese Zeile:

this.d = d; 

Nun d ist eine lokale Variable und nicht mehr Instanzvariable.

var Test = function(){ 
 
    this.rekursiv = function(d){ 
 
    console.log("case 1 granted, d: " + d); 
 
    if(d < 3) \t { 
 
     console.log("going deeper.."); 
 
     this.rekursiv(d + 1); 
 
     console.log("going back.."); 
 
    } 
 
    console.log("d: " + d ); 
 
    } 
 
} 
 
t = new Test(); 
 
t.rekursiv(0);

+1

Eigentlich d innerhalb der rekursiv-Funktion wieder deklarieren ist nicht notwendig. Diese Zeile kann entfernt werden. –

+0

@ MichałMłoźniak Sie haben Recht, es ist sinnlos, die gleiche Variable neu zu deklarieren. – gaetanoM