2016-09-29 89 views
0

的我已在的jsfiddle下列的函數:的Javascript遞歸函數返回undefined代替預期結果

function getRandomPointsInRange(range){ 

     var x1 = rand(1, 40), 
      y1 = rand(1, 40), 
      x2 = rand(1, 40), 
      y2 = rand(1, 40), 
      result; 

     if(getDistance(x1, y1, x2, y2) < range){ 
      console.log('test'); 
      getRandomPointsInRange(range); 
     }else{ 

      result = {x1: x1, y1: y1, x2: x2, y2: y2}; 
      console.log(result); 
      return result; 
     } 
    } 

它產生兩個點的距離(在這種情況下20)等於或大於一定的距離。問題是有時函數返回undefined,而不是預期的結果。你不能在JS Fiddle上看到,但控制檯日誌顯示只有當函數至少調用一次(當觸發console.log('test')時函數返回undefined即使函數返回undefined,結果本身實際上被定義爲一個對象(第二個控制檯)。日誌顯示了點正確的對象座標),這是爲什麼發生,這可怎麼固定的,所以恰當的對象將總是返回

JS小提琴鏈接:?https://jsfiddle.net/3naLztoa/2/

+0

找到答案是谷歌搜索作爲您的標題詞一樣簡單: [網站:stackoverflow.com javascript遞歸函數返回undefined](https://www.google.com/search?q=site%3Astackoverflow.com+javascript+recursive+function+returns+undefined) – 2016-09-29 12:55:55

回答

2

廈華Vista中,你需要另一個return

基本上遞歸函數需要在任何退出的值如果函數應該r創造價值。如果您沒有指定,則可以通過設計獲得undefined

爲了防止這種情況,您必須返回遞歸函數的另一個調用的值。

function getRandomPointsInRange(range) { 
    var x1 = rand(1, 40), 
     y1 = rand(1, 40), 
     x2 = rand(1, 40), 
     y2 = rand(1, 40), 
     result; 

    if (getDistance(x1, y1, x2, y2) < range) { 
     console.log('test'); 
     return getRandomPointsInRange(range); 
     // ^^^^ 
    } else { 
     result = {x1: x1, y1: y1, x2: x2, y2: y2}; 
     console.log(result); 
     return result; 
    } 
} 
0

@Nina說,你需要另一個return,並打印JSON JSON.stringify顯示結果:

function getDistance(x1, y1, x2, y2) { 
 

 
    var result = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)); 
 
    return result; 
 
}; 
 

 
function rand(min, max) { 
 
    return Math.floor(Math.random() * (max - min + 1)) + min; 
 
}; 
 

 
function getRandomPointsInRange(range){ 
 
\t \t 
 
\t \t var x1 = rand(1, 40), 
 
\t \t \t y1 = rand(1, 40), 
 
\t \t \t x2 = rand(1, 40), 
 
\t \t \t y2 = rand(1, 40), 
 
\t \t \t result; 
 
\t \t \t 
 
\t \t if(getDistance(x1, y1, x2, y2) < range){ 
 
\t \t \t return getRandomPointsInRange(range); 
 
\t \t }else{ \t \t \t 
 
\t \t \t result = {x1: x1, y1: y1, x2: x2, y2: y2}; 
 
\t \t \t return result; 
 
\t \t } 
 
\t } 
 
    document.getElementById('result').innerHTML = JSON.stringify(getRandomPointsInRange(20));
<body> 
 
    <p id="result"> 
 

 
    </p> 
 
</body>