2016-07-02 5 views
-2

Ich arbeite derzeit mit der folgenden rekursiven Funktion. Seine Rolle besteht darin, 3 Elemente 3 "Sektoren" zuzuweisen, wobei Rekursion verwendet wird, um die Funktion erneut auszuführen, bis jedes Element seinem eigenen Sektor zugewiesen ist. Es funktioniert gut die 2/9 Zeiten, wenn jedes Element bei seinem ersten Versuch einem leeren Steckplatz zugewiesen wird, aber wenn die Funktion Rekursion verwendet, wird angezeigt (wenn ich mit console.log die Variable anzeigen, die zurückgegeben werden soll) zuerst die richtigen Koordinaten und dann ein Array [undefiniert, undefiniert], das die korrekten Koordinaten als Ergebnisvariable zu überschreiben scheint. Die Funktion gibt dann [undefiniert, undefiniert] zurück.JS rekursive Funktion: funktioniert gut ohne Rekursion, gibt Antwort plus "Undefined" zurück, wenn Rekursion verwendet

Unten ist ein Beispiel für meine console.log-Ausgabe. Wie Sie sehen können, geschieht das undefinierte Ergebnis nur, wenn die Funktion mehrmals aufgerufen wird. Seltsamerweise funktioniert die Funktion (zuerst) in diesen Fällen - island_core wird realen Koordinaten zugewiesen - ersetzt dann gerade diese Arbeitskoordinaten durch ein [undefiniert, undefiniert]. Mein Code wird unterhalb der Konsolenausgabe angezeigt.

Wer weiß, wie man das anspricht? Vielen Dank für jede Hilfe, die Sie geben können!

console.log Ausgang:

ASSIGNING ISLAND 1 
Island sector distributor: 0.4996039977514938 
Water top full: false 
Water mid full: false 
Water bottom full: false 
Assigned sector mid 
Island core: 145.7255743052315, 628.1824251323584 
ASSIGNING ISLAND 2 
Island sector distributor: 0.4175444925572739 
Water top full: false 
Water mid full: true 
Water bottom full: false 
Island sector distributor: 0.9873914243694555 
Water top full: false 
Water mid full: true 
Water bottom full: false 
Assigned sector bottom 
Island core: 227.29271060663325, 819.4032413102415 
Island core: undefined, undefined 
undefined 
ASSIGNING ISLAND 3 
Island sector distributor: 0.8861211980050283 
Water top full: false 
Water mid full: true 
Water bottom full: true 
Island sector distributor: 0.8407451988967638 
Water top full: false 
Water mid full: true 
Water bottom full: true 
Island sector distributor: 0.32777241987116223 
Water top full: false 
Water mid full: true 
Water bottom full: true 
Assigned sector top 
Island core: 207.65905036573935, 173.1130653613051 
Island core: undefined, undefined 

-Code (Code innerhalb jeder Zuordnungsanweisung scheint zu funktionieren - es weist nur zufällig einen Satz von Koordinaten innerhalb eines vorgegebenen Bereichs).

var water_top_full = false; 
 
var water_mid_full = false; 
 
var water_bottom_full = false; 
 

 
//Make a recursive function that assigns islands to sectors, 
 
//and reassigns if an island is assigned to a full sector. 
 

 
var assign_island_sector = function(){ 
 
\t var island_sector_distributor = Math.random(); 
 
\t //Object for island_core 
 
\t var island_core = []; 
 
\t console.log("Island sector distributor: " + island_sector_distributor); 
 
\t console.log("Water top full: " + water_top_full); 
 
\t console.log("Water mid full: " + water_mid_full); 
 
\t console.log("Water bottom full: " + water_bottom_full); 
 
\t if (island_sector_distributor <= (1/3)){ 
 
\t \t if (water_top_full == false){ 
 
\t \t \t island_core[1] = (Math.random() * 100); 
 
\t \t \t //Upper/lower boundaries for island core expectation 
 
\t \t \t //Change higher or lower based on how close islands get to the shore 
 
\t \t \t var core_upper_limit = Math.round(island_core[1] + 50); 
 
\t \t \t //Check to make sure that top-sector lower values don't go below 0: 
 
\t \t \t var core_lower_limit; 
 
\t \t \t if (island_core[1] < 50){ 
 
\t \t \t \t core_lower_limit = Math.round(island_core[1]); 
 
\t \t \t } 
 
\t \t \t else{ 
 
\t \t \t \t core_lower_limit = Math.round(island_core[1] - 50); 
 
\t \t \t } 
 
\t \t \t island_core[0] = (Math.random() * 100); 
 
\t \t \t water_top_full = true; 
 
\t \t \t console.log("Assigned sector top"); 
 
\t \t \t //return island_core; 
 
\t \t } 
 
\t \t else if (water_top_full == true){ 
 
\t \t \t assign_island_sector(); 
 
\t \t } 
 
\t } 
 
\t else if ((island_sector_distributor > (1/3)) && (island_sector_distributor <= (2/3))){ 
 
\t \t if (water_mid_full == false){ 
 
\t \t \t island_core[1] = (100 + (Math.random() * 100)); 
 
\t \t \t //Upper/lower boundaries for island core expectation 
 
\t \t \t //Change higher or lower based on how close islands get to the shore 
 
\t \t \t var core_upper_limit = Math.round(island_core[1] + 50); 
 
\t \t \t var core_lower_limit = Math.round(island_core[1] - 50); 
 
\t \t \t island_core[0] = (Math.random() * 100); 
 
\t \t \t water_mid_full = true; 
 
\t \t \t console.log("Assigned sector mid"); 
 
\t \t \t //return island_core; 
 
\t \t } 
 
\t \t else if (water_mid_full == true){ 
 
\t \t \t assign_island_sector(); 
 
\t \t } 
 
\t } 
 
\t else if (island_sector_distributor > (2/3)){ 
 
\t \t if (water_bottom_full == false){ 
 
\t \t \t island_core[1] = (200 + (Math.random() * 100)); 
 
\t \t \t core_upper_limit = Math.round(island_core[1] + 50); 
 
\t \t \t var core_lower_limit = Math.round(island_core[1] - 50); 
 
\t \t \t island_core[0] = (Math.random() * 100); 
 
\t \t \t water_bottom_full = true; 
 
\t \t \t console.log("Assigned sector bottom"); 
 
\t \t \t //return island_core; 
 
\t \t } 
 
\t \t else if (water_bottom_full == true){ 
 
\t \t \t assign_island_sector(); 
 
\t \t } 
 
\t } 
 

 
\t console.log("Island core: " + island_core[0] + ", " + island_core[1]); 
 
\t 
 
\t return island_core; 
 
} 
 

 
for (var i = 0; i < 3; i++){ 
 
\t 
 
\t console.log("ASSIGNING ISLAND " + (i + 1)); 
 
\t var island_center = assign_island_sector(); 
 
\t for (var p = 0; p < 2; p++){ 
 
\t \t console.log(island_center[p]); 
 
\t } 
 
}

EDIT: hinzugefügt, wo ich rufen Sie die Funktion, das tut mir leid. Es teilt den zurückgegebenen Funktionswert (der ein Array mit x- und y-Koordinaten sein soll) in eine neue Variable ein, die ich dann vorwärts verwende.

+2

Könnten Sie bitte den Code-Schnipsel bearbeiten, so dass Sie tatsächlich die Funktion aufrufen? – JJJ

+0

Nur am Ende hinzugefügt. Ich kann mehr von dem nächsten Teil hinzufügen, wenn das helfen würde, aber ich denke nicht, dass es einen Weg gibt, der Teil des Problems sein könnte, da das Problem darin besteht, dass die Funktion ein Array [undefiniert, undefiniert] zurückgibt. – Mettler

+1

Könnten Sie das Code-Snippet bearbeiten, damit es das gleiche Verhalten anzeigt, das Sie beschreiben? Klicken Sie vor dem Senden auf die Schaltfläche * "Code-Snippet ausführen" *, und überprüfen Sie, ob es a) keinen Fehler auslöst und b) die gleiche Ausgabe wie zuvor in der Frage anzeigt. – JJJ

Antwort

0

Der Code ist verwirrend für mich.

Aber die undefied in console.log ist, weil Sie nicht die Rückkehr des rekursiven Aufrufs an Ihre island_core Variable setzen - so ist es den Druck in der ersten Zeit in Ordnung und Druck undefined in zweites Mal.

Versuchen Sie es zu tun:

island_core = assign_island_sector();

EDITED

var water_top_full = false; 
 
var water_mid_full = false; 
 
var water_bottom_full = false; 
 

 
//Make a recursive function that assigns islands to sectors, 
 
//and reassigns if an island is assigned to a full sector. 
 

 
var assign_island_sector = function(){ 
 
    var island_sector_distributor = Math.random(); 
 
    //Object for island_core 
 
    var island_core = []; 
 
    console.log("Island sector distributor: " + island_sector_distributor); 
 
    console.log("Water top full: " + water_top_full); 
 
    console.log("Water mid full: " + water_mid_full); 
 
    console.log("Water bottom full: " + water_bottom_full); 
 
    if (island_sector_distributor <= (1/3)){ 
 
    if (water_top_full == false){ 
 
     island_core[1] = (Math.random() * 100); 
 
     //Upper/lower boundaries for island core expectation 
 
     //Change higher or lower based on how close islands get to the shore 
 
     var core_upper_limit = Math.round(island_core[1] + 50); 
 
     //Check to make sure that top-sector lower values don't go below 0: 
 
     var core_lower_limit; 
 
     if (island_core[1] < 50){ 
 
     core_lower_limit = Math.round(island_core[1]); 
 
     } 
 
     else{ 
 
     core_lower_limit = Math.round(island_core[1] - 50); 
 
     } 
 
     island_core[0] = (Math.random() * 100); 
 
     water_top_full = true; 
 
     console.log("Assigned sector top"); 
 
     //return island_core; 
 
    } 
 
    else if (water_top_full == true){ 
 
     island_core = assign_island_sector(); 
 
    } 
 
    } 
 
    else if ((island_sector_distributor > (1/3)) && (island_sector_distributor <= (2/3))){ 
 
    if (water_mid_full == false){ 
 
     island_core[1] = (100 + (Math.random() * 100)); 
 
     //Upper/lower boundaries for island core expectation 
 
     //Change higher or lower based on how close islands get to the shore 
 
     var core_upper_limit = Math.round(island_core[1] + 50); 
 
     var core_lower_limit = Math.round(island_core[1] - 50); 
 
     island_core[0] = (Math.random() * 100); 
 
     water_mid_full = true; 
 
     console.log("Assigned sector mid"); 
 
     //return island_core; 
 
    } 
 
    else if (water_mid_full == true){ 
 
     island_core = assign_island_sector(); 
 
    } 
 
    } 
 
    else if (island_sector_distributor > (2/3)){ 
 
    if (water_bottom_full == false){ 
 
     island_core[1] = (200 + (Math.random() * 100)); 
 
     core_upper_limit = Math.round(island_core[1] + 50); 
 
     var core_lower_limit = Math.round(island_core[1] - 50); 
 
     island_core[0] = (Math.random() * 100); 
 
     water_bottom_full = true; 
 
     console.log("Assigned sector bottom"); 
 
     //return island_core; 
 
    } 
 
    else if (water_bottom_full == true){ 
 
     island_core = assign_island_sector(); 
 
    } 
 
    } 
 

 
    console.log("Island core: " + island_core[0] + ", " + island_core[1]); 
 
    
 
    return island_core; 
 
} 
 

 
for (var i = 0; i < 3; i++){ 
 
    
 
    console.log("ASSIGNING ISLAND " + (i + 1)); 
 
    var island_center = assign_island_sector(); 
 
    for (var p = 0; p < 2; p++){ 
 
    console.log(island_center[p]); 
 
    } 
 
}

+0

Können Sie einen Blick darauf werfen, ob es gedruckt wird, was erwartet wird? –

+0

Vielen Dank, ich habe die Zeilen in meinen else-if Rekursionsklauseln von assign_island_sector() geändert; nach island_core = assign_island_sector(); und jetzt funktioniert der Code einwandfrei. Entschuldigung, wenn das ein grundlegender Fehler war. – Mettler