2016-07-02 10 views
-2

現在、以下の再帰関数を使用しています。その役割は、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の座標を持つ配列であると仮定)を新しい変数に代入するだけです。

+2

は、コードスニペットを編集してくださいもらえますか? – JJJ

+0

最後に追加しました。それが助けになるなら、次の部分を追加することができますが、問題の一部になる可能性のある方法はないと思います。関数自体が配列[未定義、未定義]を返すということです。 – Mettler

+1

コードスニペットを編集して、記述しているのと同じ動作を表示できますか?投稿する前に* "Run code snippet" *ボタンをクリックして、a)エラーを投げないようにして、b)あなたが以前に質問と同じ出力を表示することを確認します。 – JJJ

答えて

0

コードは私にとっては混乱しています。

しかし、あなたはあなたのisland_core変数への再帰呼び出しの戻り値を設定されていないため、console.logundefiedがある - それは、最初の時間に細かい印刷し、二回目にundefinedを印刷しています。それを行うには

試してみてください。

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

期待どおりに印刷されているかどうか確認できますか? –

+0

ありがとう、私はelse-if再帰節の行をassign_island_sector()から変更しました。 〜にisland_core = assign_island_sector();コードは完全に動作しています。これは基本的な間違いだったと申し訳ありません。 – Mettler

関連する問題