現在、以下の再帰関数を使用しています。その役割は、3つの項目を3つの「セクター」に割り当て、各項目がそれ自身のセクターに割り当てられるまで関数を再実行する再帰を使用することです。各項目が最初の試行時に空のスロットに割り当てられたときに2/9回はうまく動作しますが、関数が再帰を使用すると、表示されます(返されるはずの変数console.logを表示すると表示されます)最初は適切な座標になり、結果の変数として適切な座標を上書きすると思われる配列[未定義、未定義]になります。この関数は[undefined、undefined]を返します。JS再帰関数:再帰なしで正常に動作し、再帰が使用されたときに回答と "未定義"が返される
以下は、私のconsole.log出力の例です。ご覧のように、未定義の結果は、関数が複数回呼び出された場合にのみ発生します。しかし、奇妙なことに、関数は(最初は)island_coreが実際の座標に割り当てられている場合に(最初は)動作します。次に、それらの作業座標を[未定義、未定義]に置き換えます。私のコードはコンソール出力の下に表示されます。
誰でもこれに対処する方法を知っていますか?何か助けてくれてありがとう!
CONSOLE.LOG出力:
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
コード(各代入ステートメント内のコード動作しているようだ - それだけでランダムに設定された範囲内の座標のセットを割り当てます)。
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 }
}
編集:私はそのことについて申し訳ありません機能を呼び出す場所を追加。それは、返された関数の値(xとyの座標を持つ配列であると仮定)を新しい変数に代入するだけです。
は、コードスニペットを編集してくださいもらえますか? – JJJ
最後に追加しました。それが助けになるなら、次の部分を追加することができますが、問題の一部になる可能性のある方法はないと思います。関数自体が配列[未定義、未定義]を返すということです。 – Mettler
コードスニペットを編集して、記述しているのと同じ動作を表示できますか?投稿する前に* "Run code snippet" *ボタンをクリックして、a)エラーを投げないようにして、b)あなたが以前に質問と同じ出力を表示することを確認します。 – JJJ