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.
Könnten Sie bitte den Code-Schnipsel bearbeiten, so dass Sie tatsächlich die Funktion aufrufen? – JJJ
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
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